在循环之外获取POST的索引

时间:2013-09-16 作者:David Fariña

我正在试图找出当前查看的帖子的索引(单个帖子页面)。

我在侧边栏中概述了同一类别的文章。但是,当用户导航到位于第2页的帖子时,文章现在应该显示第2页的文章,即使是在单个帖子页面中。

这是边栏显示实际页面帖子的代码:

    <ul>
    <?php

    $offset = 0;

    //THIS IS THE PROBLEMATIC PART

    if (is_single()) {
        $modulo = $wp_query->current_post % 6; // $wp_query->current_post somehow ever returns 0
        $offset = $wp_query->current_post - $modulo;
    }

    if (is_tag()) {
        $args = array(
            \'posts_per_page\'   => 6,
            \'tag\'              => get_query_var(\'tag\') );
    }
    else {
        $args = array(
            \'posts_per_page\'   => 6,
            \'category\'         => $cat_id,
            \'offset\'           => $offset );
    }

    $myposts = get_posts( $args );
    $i = 0;
    foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
        <li>
            <?php if (is_blog()) { ?>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            <?php } else { ?>
            <a href="#" onclick="goTo(<?php echo $i; ?>);return false;"><?php the_title(); ?></a>
            <?php } ?>
        </li>
    <?php $i++; endforeach; ?>
    </ul>
与注释一样,$wp\\u query->current\\u post总是返回0,我认为这是因为它在循环之外。

我如何解决这个问题?

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

代码的问题是$wp_query 是全局变量。通过函数加载侧栏后(dynamic_sidebar) 在使用之前,您需要将该变量全球化。

但是,一旦您在单视图中,当前的\\u post始终为0。您必须运行另一个查询,循环它,并将此查询中的每个帖子id与原始查询的帖子id进行检查,直到找到正确的索引。

最终使用前setup_postdata 全球化是一种很好的做法$post 循环启动前变量和重置后数据(带wp_reset_postdata) 循环结束后。

之前的所有提示都放在一起(未经测试):

<?php
// put this function in any accessible place, like functions.php or plugin...
function get_post_index ( $posts = array(), $vs = 0) {
  if ( empty($posts) ) return -1;
  $i = 0;
  foreach ( $posts as $one ) {
    if ( $one->ID == $vs ) return $i;
    $i++;
  }
  return -1;
}
?>

<ul>
<?php
$paged = 1;
if ( is_single() ) {
  // get ALL the posts in current category
  $all = get_posts( array(\'category\' => $cat_id, \'posts_per_page\' => -1) );
  // use the function \'get_post_index\' to retrive the post index
  $index = get_post_index( $all, get_queried_object()->ID );
  if ( $index != -1 ) {
    global $wp_query;
    $perpage = $wp_query->get(\'posts_per_page\') ? : get_option(\'posts_per_page\');
    // get the paged value as ceil of index / posts_per_page
    // e.g. if index is 13 and posts_per_page is 6 it\'s = ceil(2.1666) = 3
    $paged = ceil( $index / $perpage );
    if ( $paged == 0 ) $paged = 1;
  }
}
$args = array(\'paged\' => $paged );
if ( is_tag() ) {
  $args[\'tag\'] = get_queried_object()->slug;
} else {
  $args[\'category\'] = $cat_id;
}
$myposts = get_posts( $args );
if ( ! empty($myposts) ) :
  $i = 0;
  global $post;
  foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
  <li>
  <?php if (is_blog()) { ?>
    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
  <?php } else { ?>
    <a href="#" onclick="goTo(<?php echo $i; ?>);return false;"><?php the_title(); ?></a>
  <?php } ?>
  </li>
<?php $i++; endforeach; wp_reset_postdata(); endif; ?>
</ul>

SO网友:Matt.C

使用$wp\\u query对象,可以从post->ID获取循环外部的帖子ID

    global $wp_query;
    $thePostID = $wp_query->post->ID;

结束

相关推荐