是否可以嵌套GET_PREVICE_POST()?

时间:2015-01-04 作者:HannesH

我正在尝试检索之前和之前第二篇帖子的特色图片,以及接下来两篇帖子的特色图片。

<div id="cooler-nav" class="navigation row">
<?php $prevPost = get_previous_post(true);
    if($prevPost) {?>
    <div class="nav-box previous col-md-3">
    <?php $prevthumbnail = get_the_post_thumbnail($prevPost->ID, array(\'medium\'));}?>
    <?php previous_post_link(\'%link\',"$prevthumbnail  %title", TRUE); ?>
    </div>

<?php $prevprevPost = get_previous_post(get_previous_post(true));
    if($prevprevPost) {?>
    <div class="nav-box previous col-md-3">
    <?php $prevprevthumbnail = get_the_post_thumbnail($prevprevPost->ID, array(\'medium\'));}?>
    <?php previous_post_link(\'%link\',"$prevprevthumbnail  %title", TRUE); ?>
    </div>

<?php $nextPost = get_next_post(true);
    if($nextPost) { ?>
    <div class="nav-box next col-md-3">
    <?php $nextthumbnail = get_the_post_thumbnail($nextPost->ID, array(\'medium\') ); } ?>
    <?php next_post_link(\'%link\',"$nextthumbnail  %title", TRUE); ?>
    </div>

<?php $nextnextPost = get_next_post(get_next_post(true));
    if($nextnextPost) {?>
    <div class="nav-box next col-md-3">
    <?php $nextnextthumbnail = get_the_post_thumbnail($nextnextPost->ID, array(\'medium\'));}?>
    <?php next_post_link(\'%link\',"$nextnextthumbnail  %title", TRUE); ?>
    </div>
</div><!--#cooler-nav div -->
我想展示周围帖子的四幅特色图片,而不是下一个和上一个链接。

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

正如我之前在评论中所说

您在中使用的值无效get_previous_post()get_next_post(). 您最好在这里编写自己的函数

我得出了以下结论:

获取所有帖子的数组并确定当前帖子的位置。

获取当前帖子两侧帖子的帖子ID。ID的数量取决于$x_from_current. 当前默认值为1,这意味着它将检索当前帖子旁边的ID。如果设置为2,它将检索当前帖子旁边的两篇帖子

您还可以选择设置该功能,以从与当前帖子相同的期限中获取下一篇/上一篇帖子。只需记住将分类法以及默认值设置为category

我决定只返回相邻帖子的帖子ID,因为您需要显示缩略图,在这种情况下,您只需要帖子ID

下面是函数。我已经对它进行了很好的注释,以便您了解该函数的工作原理和使用方法

function get_x_post_from_current( $x_from_current, $in_same_term, $taxonomy, $previous ) {

    // Get the current single post ID. To be save, use get_queried_object_id()
    $current_post_id = get_queried_object_id();

    // Option to choose if adjacent posts should be from the same term. Should then set $taxonomy
    if( true === $in_same_term ) {

        /**
         * Use wp_get_post_terms() to retrieve the terms/categories the current post belongs
         * to
         *
         * @see http://codex.wordpress.org/Function_Reference/wp_get_post_terms
         *
        */ 
        $terms = wp_get_post_terms( $current_post_id, $taxonomy, [\'fields\' => \'ids\'] );

        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){

        /**
         * Use tax_query to retrieve a list of posts from the same term as the current post.
         * To speed up the query, get only post ID\'s. We don\'t need any other field\'s info
         *
         * @see http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        */ 
        $args = [
            \'posts_per_page\' => -1,
            \'fields\' => \'ids\',
            \'tax_query\' => [
                [
                    \'taxonomy\' => $taxonomy,
                    \'field\' => \'term_id\',
                    \'terms\' => $terms[0],
                    \'include_children\' => false,
                ]
            ]       
        ];

        }

    }else{

        // Default if $in_same_term is false
        $args = [
            \'posts_per_page\' => -1,
            \'fields\' => \'ids\'
        ];

    }

    $q = new WP_Query( $args );

    // Get the current post position. Will be used to determine adjacent posts
    $current_post_position = array_search( $current_post_id, $q->posts );

    /**
     * Previous posts = Newer posts
     * Next Posts = Older posts
     *
     * If $previous is true, reverse array, use array_slice to get the desired amount 
     * of ID\'s on the left of the current post. Reverse that array to keep synchronous order
     *
     * If $previous is false, slice the array to the right of the current post
     *
    */ 
    if( true === $previous ) {

        $reverse_position   = count( $q->posts ) - ( $current_post_position + 1 );
        $array_reverse      = array_reverse( $q->posts );
        $keys   = array_slice( $array_reverse, $reverse_position + 1, $x_from_current );

    }else{

        $keys = array_slice( $q->posts, $current_post_position + 1, $x_from_current );

    }

    // Returns an array of post ID\'s or an empty string if no next/previous post is found
    return $keys;

}

// Get the previous post\'s ID\'s. Amount of ID\'s to retrieve is set by $x_from_current
function get_previous_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = \'category\' ) {

    return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, true );

}

// Get the next post\'s ID\'s. Amount of ID\'s to retrieve is set by $x_from_current
function get_next_x_post_id( $x_from_current = 1, $in_same_term = false, $taxonomy = \'category\' ) {

    return get_x_post_from_current( $x_from_current,$in_same_term, $taxonomy, false ); 

}
这就是您应该如何使用单曲中的函数。php。在你的情况下,两边都需要两个帖子(下一个/前一个帖子)

$previous_posts = get_previous_x_post_id( 2 ); 
?><pre><?php var_dump($previous_posts); ?></pre><?php // Just to see the output 

if( $previous_posts ) {

    foreach ( $previous_posts as $previous_post ) {

        // $previous_post holds the post ID. Use $previous_post to return the post thumbnail

        //Get the post title
        $get_post = get_post( $previous_post );
        echo apply_filters( \'the_title\', $get_post->post_title ); 

     }

}
对下一篇文章也这样做。

这只是最低限度。您可以根据自己的需要进行扩展。你也可以看看this post 我最近做过。这是一个非常广泛的单post分页函数,如果需要,可以使用引用器和多个post类型。您可以非常轻松地在其中构建此功能

根据评论进行编辑,例如,我想从左到右对它们进行排序,即1,2,4,5。但现在是2,1,5,4号订单,我不想让他们回头

在原始代码中,出于某种未知的原因,我为以前的帖子反转了返回的帖子ID数组。现在已经解决了(或者根据知识,很遗憾,我现在无法测试任何东西)

我想在缩略图下添加标题我可以将字段更改为ID和标题吗?

没有选项只返回帖子标题。这里最好的工作是使用函数返回的post ID,并将其用于get_post 要获得特定的帖子,请使用帖子的标题。

改变函数本身来适应这一点会非常昂贵,因为您需要完全检索所有帖子,如果您有1000篇帖子,就有超时的危险。这就是为什么我想得到所有的帖子ID,因为这很快而且不太贵。最好是进行四个小的db查询,以获取四个相关帖子的信息

更新版本请参见以上代码

SO网友:Rarst

诀窍在于,此函数仅适用于当前post。但这是你可以调整的。

因此,原则上,类似的方法应该有效(未经测试):

global $post;
$post = get_next_post();
setup_postdata( $post ); // the next is now current
// do things
$post = get_next_post(); // and this time we got the next for next
// do more things
wp_reset_postdata(); // clean up when we are done

结束

相关推荐

Can't edit thumbnails

我有两个相关的问题:在媒体库中,当我单击“编辑图像”时,在左侧部分看不到允许裁剪的图像加载。同样,我无法编辑nggallery缩略图,没有加载带有裁剪器的图像。此错误仅在使用“我的主题”时发生。当我换回来说二十一点时,效果很好。然而,我不知道是什么原因导致了我的主题。有什么建议吗?编辑:我关注了toscho的评论,我注意到下面的代码导致了这里描述的问题。其中一个功能足以引发问题。1) 此代码包含来自cdn的jquery<?php /************* INCLUDE JQUERY