Вопрос или проблема
Хорошо, это может быть сложно объяснить, но я постараюсь изо всех сил.
На главной странице я хочу отображать все посты из всех категорий. Однако я хочу, чтобы они были разделены. Возьмите это в качестве примера:
Годы — это на самом деле категории. Каждая категория представляет собой другой год. Поэтому я вставляю свои посты (которые показывают только миниатюру в цикле) в категорию, относящуюся к тому, когда были сделаны фотографии.
В начале каждой категории я хочу, чтобы отображалось название категории, как показано выше. Я также использую jQuery infinite-scroll от Пола Ириша, так что, по сути, кнопки пагинации заменяются индикатором загрузки, и он просто загружается на той же странице, когда пользователь прокручивает вниз.
Мой текущий код:
<div class="post clear">
<a href="https://wordpress.stackexchange.com/questions/161475/<?php echo get_category_link(4); ?>"><div class="date"><?php echo get_cat_name(4); ?></div></a>
<?php
$catPost = get_posts('cat=4&posts_per_page=-1');
foreach ($catPost as $post) : setup_postdata($post); ?>
<?php get_template_part('content'); ?>
<?php endforeach;?>
</div>
<div class="post clear">
<a href="<?php echo get_category_link(1); ?>"><div class="date"><?php echo get_cat_name(1); ?></div></a>
<?php
$catPost = get_posts('cat=1&posts_per_page=-1');
foreach ($catPost as $post) : setup_postdata($post); ?>
<?php get_template_part('content'); ?>
<?php endforeach;?>
</div>
И это действительно работает. Ну, почти. Прежде всего, мне нужно вставлять категорию за категорией каждый раз, когда я создаю новую, при этом большая часть кода дублируется. Единственное, что меняется, это ID категорий. Было бы намного лучше, если бы я мог получить все категории одним кодом так, как мне нужно.
Кроме того, еще одна проблема — это то, что пагинация не работает. Если я прокручиваю вниз (или отключаю бесконечный скроллинг и нажимаю на вторую страницу), он просто показывает повторяющийся контент снова и снова.
Я думаю, вы поняли идею. Я хочу, чтобы пользователи могли просматривать мою галерею, и каждый раз, когда появляется новый набор фотографий из другого года, дата будет появляться на первом изображении. Я пришел к этой идее с категориями, но это становится немного сложно, чтобы заставить это работать так, как я хочу.
Есть ли решения/предложения?
Заранее спасибо!
ИЗМЕНЕНИЕ @bestprogrammerintheworld
<?php
$args=array(
'posts_per_page' => -1,
'orderby' => array( 'date' => 'DESC', 'title' => 'ASC' ), //Это работает в WP4.0!!!
'caller_get_posts'=> 1
);
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
$nr_datesyear = 0;
while ($my_query->have_posts()) : $my_query->the_post();
$year = get_the_date('Y');
if ($year !== $yeargroup && $nr_datesyear <=5) {
$nr_datesyear = 0;
echo '<div class="post clear">';
}
echo '<a href="'. $year .'"><span class="date">'. $year .'</span></a>';
get_template_part('content');
if ($year !== $yeargroup && $nr_datesyear <=5) {
echo '<div>'; //конец группы постов по году
$yeargroup = $year;
}
$nr_datesyear++;
endwhile;
}
wp_reset_query();
?>
Чтобы иметь возможность сортировать по категории, вам нужно перехватить запрос MySQL.
Начните с pre_get_posts:
add_action('pre_get_posts','setup_my_query_interception');
function setup_my_query_interception($query){
if(!is_admin() && $query->is_home() && $query->is_main_query()){
add_filter( 'posts_clauses', 'order_by_category_intercept_query_clauses', 20, 1 );
}
}
Теперь мы улучшаем запрос MySQL, чтобы включить таблицы терминов и таксономий:
function order_by_category_intercept_query_clauses($pieces){
global $wpdb;
$pieces['join'].=" LEFT JOIN $wpdb->term_relationships trt ON ($wpdb->posts.ID = trt.object_id) LEFT JOIN $wpdb->term_taxonomy ttt ON (trt.term_taxonomy_id = ttt.term_taxonomy_id) INNER JOIN $wpdb->terms termts ON (termts.term_id = ttt.term_id)";
$pieces['where'].=" AND ttt.taxonomy = 'category'";
$pieces['orderby']="termts.name ASC, ".$pieces['orderby'];
// Удалите фильтр, чтобы он выполнялся только один раз в нашем основном запросе
remove_filter('posts_clauses', 'order_by_category_intercept_query_clauses');
return $pieces;
}
Это должно привести к тому, что ваш основной запрос будет выведен, упорядоченный сначала по имени вашей категории (пагинация должна по-прежнему работать). Когда вы будете выполнять цикл, вы можете группировать свои категории следующим образом:
…перед циклом:
global $activetax;
$activetax = "";
echo '<div class="mywrapper">
…в цикле:
$cats = get_the_terms(get_the_ID(),'category');
if(is_array($cats)){
if(!($activetax==$cats[0]->name)){
$activetax = $cats[0]->name;
?>
</div>
<h2 id="tax_id_<?php echo $cats[0]->term_id; ?>" class="cat-header"><?php echo $activetax; ?></h2>
<div class="mywrapper">
<?php
}
}
get_template_part('content');
… после вашего цикла
echo "</div>";
Не тестировал, но должно работать 😉
Счастливого кодинга.
Вы также можете использовать этот код для отображения категории и поста (если вы используете категорию и пост по умолчанию в WordPress)
<?php
$terms = get_terms( 'category', array(
'hide_empty' => false,
'order_by' => 'name',
'order' => 'ASC',
'number' => 100,
'taxonomy' => 'category'
) );
//print_r($terms);
foreach($terms as $termss)
{
//echo "<br/>";
//echo $termss->term_id;
//echo "<br/>";
?>
<h1> <?php echo $termss->name; ?></h1>
<?php
//echo "<br/>";
//echo $termss->slug;
$query = query_posts("category_name="$termss->name"&showposts=5");
//print_r($query);
foreach($query as $querys)
{
//$querys->ID;
?>
<h3><?php echo $querys->post_title; ?></h3>
<p><?php echo $querys->post_content; ?></p>
<?php //echo "<br/>";
}
}
?>
Ответ или решение
Для отображения всех постов из всех категорий с пагинацией на главной странице вашего сайта WordPress, можно воспользоваться более элегантным подходом, который позволит избежать дублирования кода и упростит управление категориями. Далее представлен подробный план решения данной задачи, включая код.
Этапы реализации:
-
Запрос категорий: Мы начнем с того, чтобы получить все категории и отсортировать их. Это позволит вам динамически генерировать контент без необходимости ручного добавления ID каждой категории в код.
-
Запрос постов из категорий: Затем мы сформулируем запрос для получения постов из каждой категории, обеспечивая при этом пагинацию.
-
Отображение постов и заголовков категорий: На основе полученных данных мы будем отображать посты и заголовки категорий на странице.
-
Пагинация: Использование jQuery Infinite Scroll для динамической подгрузки контента без перезагрузки страницы.
Пример кода:
add_action('pre_get_posts', 'setup_my_query_interception');
function setup_my_query_interception($query) {
if (!is_admin() && $query->is_home() && $query->is_main_query()) {
$query->set('posts_per_page', 5); // Указание количества постов на странице
}
}
function display_all_posts_with_pagination() {
// Получаем все категории
$categories = get_categories(array('hide_empty' => false));
// Проходимся по каждой категории
foreach ($categories as $category) {
// Выводим название категории
echo '<h2 class="cat-header">' . esc_html($category->name) . '</h2>';
// Создаем новый объект WP_Query для получения постов в этой категории
$args = array(
'category__in' => array($category->term_id),
'posts_per_page' => -1, // Получать все посты
'paged' => get_query_var('paged') ? get_query_var('paged') : 1, // Поддержка пагинации
);
$cat_posts = new WP_Query($args);
// Проверяем наличие постов
if ($cat_posts->have_posts()) {
echo '<div class="mywrapper">';
while ($cat_posts->have_posts()) {
$cat_posts->the_post();
// Подключаем файл контента
get_template_part('content', get_post_format());
}
echo '</div>'; // Закрытие обертки постов
// Пагинация
echo '<div class="pagination">';
echo paginate_links(array(
'total' => $cat_posts->max_num_pages,
));
echo '</div>';
} else {
echo '<p>Постов в этой категории нет.</p>';
}
// Сбрасываем данные поста
wp_reset_postdata();
}
}
// Вызов функции в шаблоне
display_all_posts_with_pagination();
Пояснения по коду:
-
Фильтрация запросов: В самом начале мы используем
pre_get_posts
, чтобы настроить запрос так, чтобы на главной странице отображалось нужное количество постов на страницу. -
Цикл по категориям: Вместо жесткой привязки к ID категорий, мы используем цикл, который проходит по всем категориям. Это предотвращает дублирование кода и делает его более управляемым.
-
Получение постов: Для каждой категории мы создаем новый запрос
WP_Query
, чтобы получить посты этой категории, поддерживая пагинацию. -
Вывод данных и пагинация: Мы используем функцию
paginate_links()
для создания ссылок на страницы с постами. Эта функция автоматически учитывает, сколько страниц есть для текущей категории.
Заключение:
Данный подход обеспечивает более универсальное решение для отображения постов из всех категорий с пагинацией. Вы сможете легко управлять категориями и постами, не дублируя код. Вдобавок, использование jQuery Infinite Scroll улучшит пользовательский опыт, позволяя избежать перезагрузки страницы при просмотре постов.
Постоянное обновление и оптимизация кода помогут поддерживать производительность и удобство вашего сайта. Это также положительно скажется на SEO, поскольку улучшит время загрузки страниц и общее восприятие пользователями.