我是WordPress主题开发的新手,但对PHP的了解却不是这样(我来自Java和C#),并且在此自定义主题中存在以下情况
如您在主页上看到的,我首先显示一个部分(在evidenza中名为Articoli),其中包含精选帖子(我已经使用特定标签实现了该帖子),并且在其下还有另一个区域(名为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;
?>
因此,我认为这太可怕了。是真的吗
更新:
为了执行相同的操作,我发现了已添加到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
标签)以外的所有帖子来修改(实际上过滤)它
因此,如何使用带有此功能的上一个查询(用于显示特色帖子的查询)仅显示主题中未特色的帖子?还是我必须创建一个新查询?