setup_postdata() nu pare să funcționeze?

19 feb. 2011, 16:50:26
Vizualizări: 43.7K
Voturi: 17

Nu sunt sigur de ce, dar am folosit get_posts() pentru a interoga niște date. Apoi am folosit setup_postdata() ... Cred că este folosit pentru a putea utiliza funcții precum the_permalink() etc. cu noile date ale postării?

<?php foreach ($childPosts as $cp) : setup_postdata($cp); ?>

<article <?php post_class() ?> id="post-<?php the_ID(); ?>">
  <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
  <?php if (has_post_thumbnail()) : ?>
  <a href="<?php the_permalink() ?>"><?php the_post_thumbnail(($hasOutputNotFeaturedDiv) ? 'thumb-small' : null) ?></a>
  <?php endif; ?>
  <?php the_excerpt(); ?>
  <p class="more"><a href="<?php the_permalink() ?>">Citește mai mult ...</a></p>
  <?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
</article>

<?php endforeach; ?>

dar se pare că doar the_excerpt conține noua valoare a datelor postării, de ce? Am descoperit că dacă folosesc echo get_the_permalink($cp) funcționează ok. Dar cred că versiunea mai scurtă ar fi mai bună

0
Toate răspunsurile la întrebare 6
2
44

S-ar putea să greșesc, dar din ceea ce văd, "setup_postdata()" ar trebui folosit atunci când faci o interogare select personalizată (nu doar query_posts): http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

De asemenea, dacă vrei să folosești tag-uri precum "the_title()" și "the_permalink()" cu acea interogare select personalizată... va trebui să folosești numele variabilei $post în mod specific (nu alt nume de variabilă) în setup_postdata() - ÎN PLUS - ar trebui să apelezi global $post înainte de bucla ta "foreach"...

Deci, practic, urmează exemplul din link-ul către Codex. Și nu schimba numele variabilei $post - altfel nu va funcționa.

Sper că te ajută

22 feb. 2011 20:02:56
Comentarii

"ar trebui să apelezi global $post" . DA! De ce nu este asta în Codex?

AlxVallejo AlxVallejo
26 apr. 2014 20:11:39

2021 și încă am probleme cu asta haha

Andrew Schultz Andrew Schultz
25 feb. 2021 14:04:07
5
41

Înlocuiți

foreach ( $childPosts as $cp ) : setup_postdata( $cp );

cu

foreach ( $childPosts as $post ) : setup_postdata( $post );

Deci trebuie să utilizați exact variabila $post împreună cu setup_postdata().

25 aug. 2011 00:12:28
Comentarii

Asta a rezolvat problema pe care o aveam. Mulțumesc, frate!

Jeff K. Jeff K.
3 mar. 2012 00:05:04

Cineva să-i cumpere acestui om o bere! Mulțumesc.. Ai vreo idee de ce/cum o variabilă locală poate interferează cu setup_postdata()?

Odys Odys
7 nov. 2016 16:09:53

Ciudat. Pare atât de nelogic să fie necesar un nume specific de variabilă când o transmiți ca parametru.

Gavin Gavin
14 dec. 2018 09:51:02

@Gavin Nu știu de ce mai mulți oameni nu pun la îndoială cât de ciudată este uneori logica din WP. Ciudățenia pare să fie norma acum...

JDandChips JDandChips
24 iul. 2020 19:47:59

Încă o implementare minunată de la Automattticcc.

marek.m marek.m
4 nov. 2021 17:22:08
1
12

global post; nu funcționează cu setup_postdata($post); dacă dorești să utilizezi funcții precum the_title() etc.

Mai multe detalii găsești în https://codex.wordpress.org/Function_Reference/setup_postdata

În schimb, folosește

// global $post; setup_postdata($post_object); //nu face asta!
setup_postdata( $GLOBALS['post'] =& $post_object );

...de asemenea, asigură-te că $post_object este un obiect WP_Post valid.

14 sept. 2016 02:40:49
Comentarii

Acest răspuns rezolvă efectiv problema, în loc să mustre OP-ul :p

nodws nodws
24 nov. 2017 01:20:10
1
10

În funcție de locul în care folosești setup_postdata() (dacă nu este în bucla principală, sau într-o funcție/widget din bara laterală, de exemplu), poate fi necesar să declari -

global $post;
21 sept. 2011 18:50:21
Comentarii

Poți să explici de ce?

Peter Højlund Andersen Peter Højlund Andersen
4 dec. 2021 16:16:36
0

2 lucruri importante pentru a face acest lucru să funcționeze,

  1. utilizează variabila globală $post pentru a inițializa datele postului, altfel funcțiile buclă nu vor vedea obiectul tău personalizat de postare.

  2. FOARTE IMPORTANT: asigură-te că apelezi funcția wp_reset_postdata() funcție la sfârșitul buclei, altfel poți avea erori ciudate care vor fi foarte greu de depanat.

     <?php
     global $post;
    
     $myposts = get_posts( array(
         'posts_per_page' => 5,
         'offset'         => 1,
         'category'       => 1
     ) );
    
     if ( $myposts ) :
         foreach ( $myposts as $post ) :
           setup_postdata( $post ); ?>
             <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
         endforeach; 
         wp_reset_postdata();
     endif;
     ?>
    
9 nov. 2021 14:07:53
5

Când interogați postările, utilizați bucla normală cu un set de argumente transmise. Apoi resetați interogarea la final.

<?php 

    // face ca interogarea să respecte regulile de paginare
    $paged = get_query_var('paged');

    // definirea argumentelor pentru bucla personalizată
    $variablenameQuery = array(
        'post_type'                 => 'seating-charts',
        'post_status'               => 'publish',
        'cust_tax_name'             => 'custom-tax-term',
        'posts_per_page'            => -1, // -1 înseamnă toate postările
        'orderby'                   => 'date',
        'order'                     => 'ASC',
        'paged'                     => $paged,
    ); // sfârșitul interogării

    // transmite rezultatul în query_posts pentru a obține rezultatul
    query_posts($variablenameQuery);

?>
<?php if (have_posts()) : ?>

    <?php while (have_posts()) : the_post(); ?>

        <?php // Stilizarea individuală a postării ?>

    <?php endwhile; ?>

        <?php // navigare paginată - postul următor, postul anterior... ?>

    <?php else : ?>

    <h3>Oops, se pare că a apărut o problemă. Vă rugăm să <a href="<?php echo get_option('home'); ?>/contact" title="Contactați-ne">ne contactați</a> și vom rezolva problema.</h3>

<?php endif; ?>

<!-- resetează interogarea WordPress -->
<?php wp_reset_query(); ?>
19 feb. 2011 16:55:33
Comentarii

Mulțumesc, asta funcționează. Dar doar pentru înțelegere, știi de ce setup_postdata() nu pare să funcționeze? L-am folosit greșit?

Jiew Meng Jiew Meng
19 feb. 2011 17:16:37

@jiewmeng - Verifică dacă utilizarea $post în loc de $cp rezolvă problema.

t31os t31os
20 feb. 2011 03:28:43

Eu votez pentru soluția sugerată de @t31os. Exemplele din codex arată utilizarea în acest fel, iar $post este o variabilă specială în WordPress, așa că ar putea face mai multe în interiorul unei bucle decât ceea ce ai folosit tu.

curtismchale curtismchale
20 feb. 2011 03:54:04

@t31os, @curtismchale, asta nu pare să funcționeze nici acum. Încă obțin același rezultat

Jiew Meng Jiew Meng
20 feb. 2011 04:11:38

Știu că e veche discuția, dar NU folosiți query_posts() decât dacă ȘTIȚI că aveți nevoie de ea. Este ineficientă. Uitați-vă la această imagine utilă pentru alternative: https://www.rarst.net/images/query_functions.png

Tex0gen Tex0gen
29 mar. 2023 17:00:45