Loop per Pagine Figlie in WordPress: Aggiungere Classi Individuali

29 mar 2013, 13:20:57
Visualizzazioni: 19.6K
Voti: 5

Se qualcuno può aiutarmi sarebbe fantastico.

Ho trovato uno snippet di codice che ho utilizzato e che fa praticamente quello che voglio: elenca le sottopagine del genitore, aggiunge una miniatura se presente e include un excerpt personalizzato.

Tuttavia, il problema è che non riesco ad aggiungere individualmente <?php post_class(); ?> a un div all'interno del loop, sta usando la classe del genitore e la ripete per le sottopagine.

<?php
$child_pages = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_parent = ".$post->ID."    AND post_type = 'page' ORDER BY menu_order", 'OBJECT');    ?>
<?php if ( $child_pages ) : foreach ( $child_pages as $pageChild ) : setup_postdata( $pageChild ); ?>

<?php
// Deve essere all'interno di un loop.
if ( has_post_thumbnail($pageChild->ID) ) {
get_the_post_thumbnail('page-thumb-mine');
}
//  else {
//  echo '<img src="' . get_bloginfo( 'stylesheet_directory' ) . '/images/icon-cropped.png" />';
//  }
?>

<div <?php post_class(); ?>>    
<?php echo get_the_post_thumbnail($pageChild->ID, 'page-thumb-mine'); ?>
<h3><a href="<?php echo get_permalink($pageChild->ID); ?>" rel="bookmark" title="<?php     echo $pageChild->post_title; ?>"><?php echo $pageChild->post_title; ?></a></h3>
<?php echo excerpt(28); ?>
</div>
</div>
<?php endforeach; endif;
?>

Qualsiasi aiuto sarebbe apprezzato!

Grazie

Andy

0
Tutte le risposte alla domanda 1
4
12

Sono abbastanza sicuro che il problema sia che alcuni tag del template si basano sulla variabile globale $post. Usando setup_postdata() come stai facendo ora, non modificherai $post. Se sostituisci tutte le istanze di $pageChild con $post, tutto dovrebbe funzionare.

Tuttavia, consiglio vivamente di utilizzare la classe WP_Query e impostare i dati del post con 'the_post()' invece. Ecco l'equivalente del tuo codice, ma con WP_Query:

<?php
$args = array(
    'post_parent' => $post->ID,
    'post_type' => 'page',
    'orderby' => 'menu_order'
);

$child_query = new WP_Query( $args );
?>

<?php while ( $child_query->have_posts() ) : $child_query->the_post(); ?>

    <div <?php post_class(); ?>>  
        <?php  
        if ( has_post_thumbnail() ) {
            the_post_thumbnail('page-thumb-mine');
        }
        ?>
        <h3><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h3>
        <?php the_excerpt(); ?>
    </div>
<?php endwhile; ?>

<?php
wp_reset_postdata();

Nota: Ho sistemato alcune altre cose nel codice che hai postato. Inoltre, ho sostituito la tua funzione personalizzata excerpt() con the_excerpt() così il codice di esempio funziona per chiunque voglia copiarlo/incollarlo.

Riferimenti:

https://codex.wordpress.org/Class_Reference/WP_Query

https://codex.wordpress.org/Function_Reference/setup_postdata

29 mar 2013 17:42:02
Commenti

@BigBabel Sei un mito, funziona perfettamente, scusa per il codice disordinato, stavo provando di tutto e non riuscivo a ricordare lo stato originale. - Sì, ho una funzione di excerpt personalizzata nel mio file functions. - Comunque, grazie mille ancora, apprezzo davvero il tempo che hai dedicato per rispondere.

Andy Andy
29 mar 2013 18:41:18

Questa riga di codice sembra interrompere il loop: <?php echo excerpt(28); ?> L'ho rimossa e il codice di esempio ha funzionato alla grande.

metaColin metaColin
22 feb 2017 02:00:26

Forse sarebbe meglio rimuovere quella riga dalla risposta poiché la maggior parte degli utenti arriva qui tramite Google e cerca semplicemente del codice che crei un loop di pagine figlie.

Richard Lindhout Richard Lindhout
23 dic 2017 17:40:20

@RichardLindhout Speravo che la nota che ho incluso riguardo a quella funzione fosse sufficiente per evitare che le persone avessero problemi. Tuttavia, considerando l'età di questa domanda, di sicuro non farebbe male rendere ora l'esempio di codice più generico. Grazie!

BigBagel BigBagel
5 feb 2018 01:56:29