Я досить новий в розробці тем WordPress, і я не так в PHP (я прийшов з Java та C #) і маю таку ситуацію в цій спеціальній темі
Як ви бачите на домашній сторінці, я спочатку показую розділ (з назвою Articoli in evidenza ), що містить представлені публікації (я реалізував це за допомогою певного тегу), а під ним є ще одна область (названа Ultimi Articoli ), яка містить останню публікацію це не рекомендований пост.
Для цього я використовую цей код:
<section id="blog-posts">
<header class="header-sezione">
<h2>Articoli in evidenza</h2>
</header>
<!--<?php query_posts('tag=featured');?>-->
<?php
$featured = new WP_Query('tag=featured');
if ($featured->have_posts()) :
while ($featured->have_posts()) : $featured->the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part('content', get_post_format());
endwhile;
wp_reset_postdata();
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
<header class="header-sezione">
<h2>Ultimi Articoli</h2>
</header>
<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
/*
* Include the post format-specific template for the content. If you want to
* use this in a child theme, then include a file called called content-___.php
* (where ___ is the post format) and that will be used instead.
*/
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
</section>
Це прекрасно працює, але я маю певні сумніви щодо якості цього рішення та як саме воно працює.
Для вибору всіх представлених публікацій я використовую цей рядок, який створює новий WP_Query
об’єкт, який визначає запит, що містить конкретний тег featured
:
$featured = new WP_Query('tag=featured');
Потім я повторюю цей результат запиту, використовуючи його have_posts()
метод.
Отже, з того, що я зрозумів, це не основний запит WordPress, але це новий запит, створений мною. З того, що я розумію, краще створити новий запит (як зроблено), а не використовувати основний запит, коли я хочу виконати подібну операцію.
Це правда, чи я щось пропускаю? Якщо це правда, чи можете ви пояснити мені, чому краще створити новий спеціальний запит, а не змінювати основний запит Wordpress?
Гаразд, продовжуємо. Я показую всі публікації, які не мають тегу "показаний". Для цього я використовую цей фрагмент коду, який, навпаки, змінює основний запит:
<?php
// get the term using the slug and the tag taxonomy
$term = get_term_by( 'slug', 'featured', 'post_tag' );
// pass the term_id to tag__not_in
query_posts( array( 'tag__not_in' => array ( $term->term_id )));
?>
<?php
if (have_posts()) :
// Start the Loop.
while (have_posts()) : the_post();
get_template_part('content', get_post_format());
endwhile;
else :
// If no content, include the "No posts found" template.
get_template_part('content', 'none');
endif;
?>
Тому я думаю, це досить жахливо. Це правда?
ОНОВЛЕННЯ:
Щоб виконати ту саму операцію, я знайшов цю функцію (у великій відповіді нижче), яку я додав у function.php
function exclude_featured_tag( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'tag__not_in', 'array(ID OF THE FEATURED TAG)' );
}
}
add_action( 'pre_get_posts', 'exclude_featured_tag' );
Ця функція має гачок, який викликається після створення об'єкта змінної запиту, але перед запуском фактичного запиту.
Отже, з того, що я зрозумів, він приймає об’єкт запиту як вхідний параметр і змінює (фактично фільтрує) його, вибираючи всі повідомлення, виключаючи конкретний тег (у моєму випадку featured
повідомлення про теги)
Отже, як я можу використовувати попередній запит (той, який використовується для показу популярних публікацій) за допомогою цієї функції, щоб відображати лише непопулярні публікації в моїй темі? Або мені потрібно створити новий запит?