Я довольно новичок в разработке тем WordPress и не очень разбираюсь в PHP (я пришел с Java и C #), и у меня есть следующая ситуация в этой пользовательской теме
Как вы можете видеть на главной странице, я сначала показываю раздел (названный Articoli в 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?
Хорошо, продолжай. Я показываю все сообщения, у которых нет тега «Featured». Для этого я использую этот фрагмент кода, который, напротив, изменяет основной запрос:
<?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;
?>
Так что я думаю, это довольно ужасно. Это правда?
ОБНОВИТЬ:
Для выполнения той же операции я нашел эту функцию (в отличном ответе ниже), которую я добавил в functions.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
тег сообщения)
Итак, как я могу использовать предыдущий запрос (тот, который использовался для показа избранных постов) с этой функцией, чтобы показывать только не показанные посты в моей теме? Или мне нужно создать новый запрос?