归档文件中的自定义POST循环返回相同的固定链接(_P)

时间:2015-05-10 作者:Alexander Wigmore

我有以下代码,用于从提供的每个自定义帖子类型中获取最新的帖子($customTypes), 它适用于我网站的大多数页面,例如:http://trulycode.com/ - 右侧的灰色/黄色/蓝色方框显示了3种帖子类型中的最新帖子。

然而,在存档页面上,它在3个框中的每个框上都显示了相同的帖子,例如,请参见侧边栏中的差异:http://trulycode.com/php/ - 所有这些当前都链接到相同的Apple Watch Review 邮递

我尝试了wp\\u reset\\u postdata()和wp\\u reset\\u query(),这两种方法都没有效果。你知道为什么它只是为了存档而这样做吗。php模板页?

<div class="three columns">
<?php
$customTypes = array(\'videos\',\'Downloads\',\'Bytes\');
foreach ($customTypes as $key=>$value) {
  $args = array( \'post_type\' => $value, \'posts_per_page\' => 1 );
  $loop = new WP_Query( $args );
  if ($loop->have_posts()) :
    while ( $loop->have_posts() ) :
      $loop->the_post();
  ?>
    <a href="<?php the_permalink(); ?>" class="blocky-linker">
      <?php
      if ($key == 0) {
        echo \'<div class="blocky blocky--dark wow fadeIn" data-wow-duration="1s" data-wow-delay="1.\'.$key.\'s">\';
      } elseif ($key == 1) {
        echo \'<div class="blocky blocky--yellow wow fadeIn" data-wow-duration="1s"data-wow-delay="1.\'.$key.\'s">\';
      } else {
        echo \'<div class="blocky blocky--blue wow fadeIn" data-wow-duration="1s"data-wow-delay="1.\'.$key.\'s">\';
      }
      ?>
        <h3>Latest <?= $value ?></h3>
        <?php
        if ( has_post_thumbnail() ) {
          the_post_thumbnail();
        }
        ?>
        <h6><?php the_title(); ?> &rarr;</h6>
      </div>
    </a>
  <?php
    endwhile;
  endif;
}
?>

</div>

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

这是你答案的延伸。你的pre_get_posts 行动有一些缺陷

function add_custom_types_to_tax( $query ) {
  if( is_category() || is_tag() && empty( $query->query_vars[\'suppress_filters\'] ) ) {
    // Get all your post types
    $post_types = get_post_types();

    $query->set( \'post_type\', $post_types );
    return $query;
  }
}
add_filter( \'pre_get_posts\', \'add_custom_types_to_tax\' );
  • is_category()is_tag() 应为属性$query

    检查是否suppress_filters 是真是假。除非另有设置,否则主查询始终设置为truepre_get_posts

  • pre_get_posts 是一个操作,而不是筛选器

    无需返回操作。

  • pre_get_posts 更改的所有实例WP_Query (主查询还使用WP_Query), 前端和后端。您应该始终使用is_main_query() 仅针对主查询,并使用!is_admin() 仅针对前端(主页上不需要此检查)

您的代码应该如下所示

function add_custom_types_to_tax( $query ) {
  if( !is_admin() && $query->is_main_query() ) {
    if ( $query->is_category() || $query->is_tag() ) {
    // Get all your post types
    $post_types = get_post_types();

    $query->set( \'post_type\', $post_types );
    }
  }
}
add_action( \'pre_get_posts\', \'add_custom_types_to_tax\' );
这应该可以解决您的问题,而不需要任何进一步的代码

其他注释:

  • get_post_types() 在当前使用状态下,它返回all 注册帖子类型,包括修订和导航菜单项。你会想看看build_in parameter 排除所有内置类型,只返回自定义的post类型。

    对于未分页的自定义查询,请使用get_posts 或将以下两个参数添加到WP_Query

    • \'suppress_filters\' => true 这将禁止所有筛选器更改您的自定义查询。

    • \'no_found_rows\' => true\' 这将获得所需数量的职位,并立即纾困。的默认行为WP_Query 是为了寻找all 与查询匹配的帖子,以便统计用于分页的帖子。这浪费时间。背景no_found_rowstrue, WP_Query 跳过此过程。如果达到所需的帖子数量,它会立即停止执行查询并返回帖子。这样可以节省执行时间,加快查询速度。

(NOTE: get_posts() 使用WP_Query 这两个参数已相应设置。这就是为什么get_posts 无法正常分页以及原因get_posts 不会被过滤器更改

SO网友:Alexander Wigmore

感谢@Pieter Goosen的评论,他建议这可能与pre_get_posts. 我玩了一场,当然这似乎是个问题。这是我的旧代码:

Old Code

function add_custom_types_to_tax( $query ) {
  if( is_category() || is_tag() && empty( $query->query_vars[\'suppress_filters\'] ) ) {
    // Get all your post types
    $post_types = get_post_types();

    $query->set( \'post_type\', $post_types );
    return $query;
  }
}
add_filter( \'pre_get_posts\', \'add_custom_types_to_tax\' );
我用下面的代码替换了它,这似乎解决了我的问题。在存档页上(例如:http://trulycode.com/php/) 侧框现在显示每个自定义帖子类型的第一篇帖子。

Working code:

function custom_post_archive($query) {
    if ($query->is_archive){
      $post_types = get_post_types();
      $query->set( \'post_type\', $post_types );
    }
    remove_action( \'pre_get_posts\', \'custom_post_archive\' );
}
add_action(\'pre_get_posts\', \'custom_post_archive\');

结束

相关推荐

Loop for sticky posts

我用过Justin Tadlock\'s 关于如何创建仅包含粘性帖子的循环的教程。代码大致如下所示:$sticky = get_option( \'sticky_posts\' ); rsort( $sticky ); $sticky = array_slice( $sticky, 0, 2 ); query_posts( array( \'post__in\' => $sticky, \'caller_get_posts\' => 1 ) ); 根据教程,我