web-dev-qa-db-ja.com

指定されたタグを持つホームページからの投稿を除する

私はWordPress開発ではかなり新しいです、そして私はいわゆる 特集記事を扱うこのカスタムテーマを実装しようとしています

あなたがホームページの投稿領域で見ることができるように私は私の特集投稿を含む Articoli in evidenza サブ領域を持っています最新の投稿が含まれているUltimi Articoli subarea。

これを暗示するために私はpostsタグを使い、将来の投稿領域にtag=featured条件を持つ投稿を表示します。

だからこれは私のコードです:

<section id="blog-posts">

<header class="header-sezione">
        <h2>Articoli in evidenza</h2>
</header>

<?php query_posts('tag=featured');?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  <div id="featured-posts">

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
      <div class="meta">
Scritto da <span class="author"><?php the_author_link(); ?></span> &nbsp;//&nbsp;  <?php the_category(', ') ?>  &nbsp;//&nbsp;  <?php comments_popup_link('Nessun Commento', '1 Commento ', '% Commenti'); ?> 
      </div>
      <div class="featured-details"><?php the_excerpt()?>
      <?php $featured_img = get_post_meta($post->ID, 'featured_img', $single = true); ?>
      <a href="<?php the_permalink(); ?>"><img src="<?php echo $featured_img ?>" alt="<?php the_title(); ?>" /></a>
      </div>
    </div>

<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>



    <header class="header-sezione">
        <h2>Ultimi Articoli</h2>
    </header>

    <?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>

あなたが最初に見ることができるように私はquery-posts()関数の使用によってタグfeaturedを持つ投稿を示します:

<?php query_posts('tag=featured');?>

私の問題は、投稿にfeaturedタグがある場合、それが最新の投稿領域に表示されないようにすることです(現時点では表示されていません)。だから私はこのコードを使用しようとしました:

<header class="header-sezione">
    <h2>Ultimi Articoli NOT FEATURED</h2>
</header>

<?php query_posts('tag != featured');?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  <div id="featured-posts">

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
      <div class="meta">
Scritto da <span class="author"><?php the_author_link(); ?></span> &nbsp;//&nbsp;  <?php the_category(', ') ?>  &nbsp;//&nbsp;  <?php comments_popup_link('Nessun Commento', '1 Commento ', '% Commenti'); ?> 
      </div>
      <div class="featured-details"><?php the_excerpt()?>
      <?php $featured_img = get_post_meta($post->ID, 'featured_img', $single = true); ?>
      <a href="<?php the_permalink(); ?>"><img src="<?php echo $featured_img ?>" alt="<?php the_title(); ?>" /></a>
      </div>
    </div>

<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>

しかしこれは機能せず、注目の投稿はまだホームページに表示されます。ご覧のとおり、表示するには投稿にfeaturedタグを付けることはできません。

<?php query_posts('tag != featured');?>

なぜこれがうまくいかないのですか?何が足りないの?

1
AndreaNobili

対処したいエラーがいくつかあります

まず第一に、あなたはカスタムクエリを構築するために決して query_posts を使うべきではありません。これは私の強調だけではなく、コーデックスです。 query_postsの一つの大きな問題は、多くの状況で、ページ付けが失敗することです

注:この機能は、プラグインやテーマで使用するためのものではありません。後で説明するように、メインクエリを変更するためのより優れた、より高性能なオプションがあります。 query_posts()は、ページのメインクエリを新しいクエリインスタンスに置き換えることによって変更する、非常に単純で問題の多い方法です。これは非効率的で(SQLクエリを再実行する)、状況によっては完全に失敗する可能性があります(特に投稿ページ付けを扱うときによくあります)。

次に、不要な場所で不要なクエリを実行しないでください。メインクエリは、 pre_get_posts を使用して非常に簡単に変更できます。これにより、カスタムクエリを使用して不要なデータベースクエリを実行する必要がなくなります。

このフックは、クエリ変数オブジェクトが作成された後、実際のクエリが実行される前に呼び出されます。

3つ目は、選択肢がなく、カスタムクエリを実行する必要がある場合は、 WP_Query または で実行します。 get_postsの代わりにquery_posts

また、あなたはphpタグを悪用しています。 phpとhtmlを切り替えない限り、各コードの後に​​phpタグを開いたり閉じたりする必要はありません。例えば

 </div>
    </div>

<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>

</div>

ように書き換えることができます

</div>
    </div>

<?php 
   endwhile;
   else :
   endif;
?>

</div>

これが私がこの問題に取り組む方法です。私はそれが最善の解決策であるとは言いませんが、それはあなたの目標を達成するためのより良くそしてよりきれいな方法です

注目のコンテンツに対する最初のクエリは、次のようになります。

<section id="blog-posts">

<header class="header-sezione">
        <h2>Articoli in evidenza</h2>
</header>

<?php 

$featured = new WP_Query('tag=featured');

if ($featured->have_posts()) : 
  while ($featured->have_posts()) : $featured->the_post(); ?>

   <---YOUR LOOP ELEMENTS--->

<?php 
  endwhile; 

  wp_reset_postdata();

endif; 
?>

あなたのメインループはそのままで大丈夫です、私はそれに何も変更しません。 タグを除外するためにここでカスタムクエリを使用しないでください。そのためにはpre_get_postsを使用してください。これはどうですか

あなたのfunctions.phpに、あなたのホームページのメインのクエリーから注目のタグから投稿を削除するために次のコードを追加してください。ホームページをターゲットにするには、 is_home() 条件タグを使用します。

編集

私はこれを含めるのを忘れました。管理ページにいないかどうかを確認するためのチェックを含めることは常に安全です(!is_admin())。その理由は、pre_get_postsはフロントエンドとバックエンドの両方で使われるメインのクエリを変更するため、すべての変更はフロントエンドとバックエンドで見られるようになります。フロントエンドで変更を加えたいだけなので、変更されたコードは次のようになります。

function exclude_featured_tag( $query ) {
    if ( !is_admin() && $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' );
3
Pieter Goosen
<?php
$args = array(
'posts_per_page' => 5,
'cat' => 2,
'tag__not_in' => array(5), // Assuming 5 is the ID for the tag
'order' => 'asc'
 );

 $query = new WP_Query($args);
 while ($query->have_posts()) :
 $query->the_post();

 ...

  endwhile;
   // don't forget to reset/restore the query
   wp_reset_postdata();

 ?>

必ずtag_not_inにタグID番号を付けてください。それにタグ名を与えてはいけません。タグ名では動作しません。

1
Zammuuz