私は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
タグ投稿)を除くすべての投稿を選択することによってそれを変更(実際にはフィルタリング)します
それでは、この機能で以前のクエリ(注目の投稿を表示するために使用されるクエリ)を使用して、テーマの注目されていない投稿のみを表示するにはどうすればよいですか?または、新しいクエリを作成する必要がありますか?