Вопрос или проблема
Я создаю страницу на WordPress, где все мои посты в дочерних категориях команды отображаются в сетке. Я смог это сделать с помощью приведенного ниже кода. Форматирование и общий макет отличные, однако отображаются только 5 самых последних постов в дочерней категории вместо всех. В моем аккаунте WordPress у меня есть 7 постов, которые должны отображаться. Как мне получить посты, чтобы отображались все?
<ul class="faces">
<?php
$categories = get_categories( 'child_of=2' );
foreach ( $categories as $category ) {
echo '<div class="grid-row"><h2>'.$category->name.'</h2></div>';
$cat_posts = get_posts( 'cat=".$category->term_id );
$end = count( $cat_posts ) - 1;
$i = 0;
foreach ( $cat_posts as $post ) {
setup_postdata( $post );
$face = get_field( "face' );
$name = get_field( 'fullname' );
if ( $i % 6 === 0 ) {
echo '<div class="grid-row">';
}
echo '<div class="obj">';
echo wp_get_attachment_image($face)
. '<div class="name">'.$name.'</div>';
echo '</div>';
if ( $i % 6 === 5 ) {
echo '</div>';
}
$i++;
}
}?>
</ul>
//css
div.grid-row {
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
}
div.obj{
float: left;
position: relative;
padding-right: 10px;
}
.faces{
width: 1000px;
}
ИЗМЕНЕНО ДЛЯ НИЖЕПРИВЕДЕННОГО ПОСТА:
ИЗМЕНИТЬ ДЛЯ НИЖЕПРИВЕДЕННОГО ПОСТА:
<?php
$categories = get_categories( 'child_of=2' );
foreach ( $categories as $category ) {
echo '<div class="grid-row"><h2>'.$category->name.'</h2></div>';
$args1 = array( 'posts_per_page' => -1, 'cat=".$category->term_id );
$cat_posts = get_posts( $args1 );
$end = count( $cat_posts ) - 1;
$i = 0;
foreach ( $cat_posts as $post ) {
$post_category = get_the_category($post->ID);
if($post_category->cat_name == $category->name){
setup_postdata( $post );
$face = get_field( "face' );
$name = get_field( 'fullname' );
if ( $i % 6 === 0 ) {
echo '<div class="grid-row">';
}
echo '<div class="obj">';
echo '<div class="faceThumb">';
echo wp_get_attachment_image($face);
echo '</div>';
echo '<div class="name">';
echo $name;
echo '</div>';
echo '</div>';
if ( $i % 6 === 5 ) {
echo '</div>';
}
}
$i++;
}
}?>
Одним из аргументов, которые вы можете передать в get_posts, является posts_per_page. Если вы не включите это, оно будет по умолчанию установлено на настройку «Показать страниц максимум» на странице «Чтение» в ваших настройках. http://wordpress.org/support/topic/get_posts-not-pull-all-posts-unless-numberposts-in-query. Да, я знаю, что тема форума устарела на 2 года, но она подтверждает подозрение, которое у меня возникло после прочтения http://codex.wordpress.org/Template_Tags/get_posts и исходного файла, указанного внизу этой страницы.
Может быть намного проще. Я не знаю, что такое get_field
, думаю, это ваша пользовательская функция… но зачем не использовать стандартные пользовательские поля и функцию миниатюры поста? В любом случае
$categories = get_categories( 'child_of=3' );
foreach ( $categories as $category ) {
$i = -1;
echo '<div class="grid-row"><h2>' . $category->name . '</h2></div>';
$args = array( 'posts_per_page' => -1, 'cat' => $category->term_id );
$cat_posts = new WP_Query($args);
if ( $cat_posts->have_posts() ) : while ( $cat_posts->have_posts() ) :
$i++;
$cat_posts->the_post();
$face = get_field( 'face' );
$name = get_field( 'fullname' );
if ( $i % 6 == 0 ) echo '<div class="grid-row">';
echo '<div class="obj">';
echo '<div class="faceThumb">';
echo wp_get_attachment_image($face);
echo '</div><div class="name">' . $name . '</div></div>';
if ( ($i % 6 == 5) || $i == ($cat_posts->post_count - 1) ) echo '</div>';
endwhile; endif;
}
wp_reset_postdata();
Ответ или решение
Чтобы отобразить все сообщения в дочерних категориях WordPress, вам необходимо внести несколько изменений в ваш текущий код. В этом ответе я приведу подробные инструкции с объяснениями для каждого шага.
1. Цель
Мы стремимся вывести все посты из дочерних категорий определенной категории (в вашей ситуации, дочерние категории категории с ID 2) вместо 5 последних постов.
2. Использование WP_Query для получения всех постов
Ваш исходный код использует get_posts
, но по умолчанию эта функция ограничивает количество возвращаемых постов согласно настройкам отображения на странице "Чтение". Чтобы получить все посты, используйте параметр posts_per_page
равный -1
.
3. Корректировки кода
Вот ваш обновленный код с внесенными изменениями:
<ul class="faces">
<?php
$categories = get_categories('child_of=2');
foreach ($categories as $category) {
echo '<div class="grid-row"><h2>' . esc_html($category->name) . '</h2></div>';
$args1 = array(
'posts_per_page' => -1, // Получаем все посты
'cat' => $category->term_id,
);
$cat_posts = new WP_Query($args1);
if ($cat_posts->have_posts()) {
$i = 0;
while ($cat_posts->have_posts()) {
$cat_posts->the_post();
$face = get_field("face");
$name = get_field('fullname');
if ($i % 6 === 0) {
echo '<div class="grid-row">';
}
echo '<div class="obj">';
echo '<div class="faceThumb">' . wp_get_attachment_image($face) . '</div>';
echo '<div class="name">' . esc_html($name) . '</div>'; // Обеспечение безопасности вывода данных
echo '</div>'; // Закрытие div.obj
if ($i % 6 === 5) {
echo '</div>'; // Закрытие div.grid-row
}
$i++;
}
// Закрытие оставшейся div.grid-row, если необходимо
if ($i % 6 !== 0) {
echo '</div>';
}
}
wp_reset_postdata(); // Сбросим данные после цикла
}
?>
</ul>
4. Объяснения изменений:
-
WP_Query: Мы использовали
new WP_Query($args1)
, чтобы извлечь посты с вашими аргументами. Это мощный класс, который позволяет получать и обрабатывать данные постов в WordPress. -
posts_per_page: Значение
-1
заставляет WordPress вернуть все посты, игнорируя остальные настройки по количеству отображаемых постов. -
esc_html(): Мы используем эту функцию для экранирования имени категории и имени (полного имени), что улучшает безопасность и защиту от XSS-атак.
-
wp_reset_postdata(): Эта функция позволяет сбросить глобальные переменные, чтобы избежать конфликтов с будущими запросами постов.
5. Итоги
С помощью приведенных выше изменений ваш шаблон теперь будет правильно отображать все сообщения из дочерней категории в стиле сетки, как вы и запланировали. Убедитесь, что вы проверяете код на тестовом сайте, прежде чем развернуть его на живом, чтобы убедиться, что все работает должным образом.
Если у вас есть дополнительные вопросы или вы хотите внести другие изменения, пожалуйста, дайте знать!