Цикл дочерних страниц в WordPress - добавление классов к постам

29 мар. 2013 г., 13:20:57
Просмотры: 19.6K
Голосов: 5

Если кто-то может помочь, буду очень признателен.

Я нашел фрагмент кода, который делает почти то, что мне нужно - выводит список дочерних страниц родителя, добавляет миниатюру, если она есть, и пользовательское краткое описание.

Однако проблема в том, что я не могу добавить индивидуальные <?php post_class(); ?> к div внутри цикла - он использует класс родителя и повторяет его для всех дочерних страниц.

<?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
// Должно быть внутри цикла
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;
?>

Любая помощь будет оценена!

Спасибо,

Энди

0
Все ответы на вопрос 1
4
12

Я почти уверен, что проблема заключается в том, что некоторые теги шаблонов зависят от глобальной переменной $post. Использование setup_postdata(), как вы делаете сейчас, не изменяет $post. Если вы замените все вхождения $pageChild на $post, всё должно заработать.

Однако я настоятельно рекомендую использовать класс WP_Query и настраивать данные записи с помощью 'the_post()'. Вот эквивалент вашего кода, но с использованием 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();

Примечание: я также немного подчистил ваш код. Кроме того, я заменил вашу пользовательскую функцию excerpt() на the_excerpt(), чтобы пример кода работал для всех, кто захочет скопировать/вставить его.

Ссылки:

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

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

29 мар. 2013 г. 17:42:02
Комментарии

@BigBabel Ты просто звезда, это работает идеально, извини за грязный код — я перепробовал кучу вариантов и уже не помню исходное состояние. — Да, у меня есть пользовательская функция для вывода отрывков в файле functions. — В любом случае, ещё раз огромное спасибо, я очень ценю время, которое ты потратил на ответ.

Andy Andy
29 мар. 2013 г. 18:41:18

Эта строка кода, кажется, ломает цикл: <?php echo excerpt(28); ?> Я удалил её, и пример заработал отлично.

metaColin metaColin
22 февр. 2017 г. 02:00:26

Возможно, стоит убрать эту строку из ответа, так как большинство пользователей попадают сюда через Google и ищут просто код для вывода дочерних страниц.

Richard Lindhout Richard Lindhout
23 дек. 2017 г. 17:40:20

@RichardLindhout Я надеялся, что примечание, которое я добавил к этой функции, будет достаточным, чтобы уберечь пользователей от проблем. Однако, учитывая возраст этого вопроса, определённо не будет лишним сделать пример кода более универсальным сейчас. Спасибо!

BigBagel BigBagel
5 февр. 2018 г. 01:56:29