从具有指定标签的主页中排除帖子

时间:2014-07-17 作者:AndreaNobili

我是WordPress开发方面的新手,我正在尝试实现这个自定义主题来处理所谓的featured posts

如你所见,在主页的帖子区域中,我有一个子区域,其中包含我的特色帖子,下面有一个子区域,其中包含最新帖子。

为了实现这一点,我使用posts标签,并在futured 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>
正如您首先看到的,我显示了带有标记的帖子featured 通过使用query-posts() 功能:

<?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\');?>
为什么这个不行?我错过了什么?

3 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

我想解决一些错误

首先,你不应该使用query_posts 构造自定义查询。这不仅是我的重点,也是抄本。最大的问题是query_posts 在许多情况下,分页都会失败

Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

其次,不要在不需要的地方运行不必要的查询。使用可以很容易地修改主查询pre_get_posts, 这样可以节省使用自定义查询执行的不必要的数据库查询

此挂钩在创建查询变量对象之后,但在实际查询运行之前调用。

第三,如果您没有选择,并且必须运行自定义查询,请使用WP_Queryget_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; 
?>
你的主循环很好,我不会对此做任何更改。DO NOT 在此处使用自定义查询排除标记。使用pre_get_posts 这样做。以下是如何

在您的功能中。php中,添加以下代码以从主页上的主查询中删除特征标记中的帖子。您将使用is_home() 以主页为目标的条件标记

EDIT

我忘了包括这个。始终是故障安全的,包括检查您是否不在管理页上(!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\' );

SO网友:Zammuuz

<?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\\u not\\u in提供标记id号。不要给它起标签名。它不适用于标记名。

SO网友:AndreaNobili

由我自己使用以下方法解决:

<?
    // 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 )));
?>

结束

相关推荐

插件管理菜单中的EDIT-TAGS.php在活动页面时隐藏

对于我正在构建的插件,我在admin中的自定义主菜单项中添加了一个子菜单作为子菜单。子菜单页是edit-tags.php 页这将按预期显示在主菜单项下。单击此子菜单项时,用户将进入正确的页面,但主菜单项会向下折叠,隐藏当前打开的子菜单项。我最初的感觉是父slug属性是错误的,但我添加的其他子菜单使用相同的父slug属性,并且它们工作正常。很明显,我在add_submenu_page() 函数,但我不知道是什么。下面是我注册子菜单的方式:$this->plugin_screen_dashboard =