显示同一类别中的下一个帖子,但从最新帖子开始

时间:2014-11-25 作者:Debajyoti Das

我正在显示下一个帖子用户应该读为。。。

<?php previous_post_link(\'%link\', \'<span>%title</span>\', TRUE); ?>
但是,如果一个类别中有20个帖子,而我是第7个。我想展示第一个(最新的)而不是第八个(以上)。。。作为下一个帖子。如果我在第一个,那么应该显示第二个作为下一个。

我该怎么做?做previous_post_link 具有允许此操作的内置参数。

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

本机无法实现这一点,因此需要通过自定义函数来实现。

以下是您需要执行的操作:

此完整解决方案基于内置分类法,category

您需要实施一个系统,根据该系统,您需要确定在特定类别中查看的当前职位的当前职位。

您需要获取特定类别中最新帖子的ID,换句话说,就是最新发布的帖子。

查看第7篇文章以及第6篇文章的链接时,请链接到该类别中的最新文章。

仅在所有早于第7篇文章的文章中显示一篇文章的链接。

显示next_post_link()previous_post_link() 查看比第7篇文章更新的文章时

让我们进行编码,我们需要获取查看的单个帖子的帖子ID,必要时还需要获取帖子类型。要得到这个,你可以利用get_queried_object()

一旦我们做到了这一点,我们需要确定这篇文章属于哪个类别。这是通过使用get_the_category(). (请注意,只有当一篇文章只属于一个类别时,这才会成功。如果有多个类别,则使用第一个类别)。

所有这些信息将在自定义查询中使用get_posts. 因为我们只需要post ID,所以我们只需要检索它。

返回的帖子ID数组是用于确定帖子位置和该类别中最新帖子的数据。

这个查询以后可能会非常昂贵,所以我们将把所有数据保存到一个数据库中transient 我设定每7天过期一次。所有需要的数据都将存储在名为$numbers

一旦帖子被更新、删除或发布,我们还需要删除并重新创建瞬态。为此,我们将使用transition_post_status 行动挂钩

一切准备就绪后,我们转向单曲。php模板。这是您要显示所需内容的地方。如上所述

对于7岁以上的帖子,只显示最新的帖子链接

显示最新的帖子链接和next_post_link() 在7号柱上

显示next_post_link()previous_post_link() 查看比第7篇文章更新的文章时

要获取该类别的最新帖子,您将使用get_post() ID保存在$numbers 变量

这应该可以

这是完整的代码(根据需要进行修改。我已经对其进行了测试,它的工作原理与您在问题中所述的一致)

在函数中。php

function get_display_post_number() {

    $query_object   = get_queried_object();
    $id             = $query_object->ID;
    $transient_id   = \'post_number_\' . $id;

    if ( false === ( $numbers = get_transient( $transient_id ) ) ) {
        $categories = get_the_category( $id );
        $cat        = $categories[0]->cat_ID;

        $post_args = [ 
            \'post_type\'         => $query_object->post_type,
            \'cat\'               => $cat,
            \'fields\'            => \'ids\',
            \'posts_per_page\'    => -1,
            \'order\'             => \'ASC\',

        ];

        $q = get_posts( $post_args );

        $total_posts    = count( $q );
        $post_number    = array_search( $id, $q ) + 1;
        $current_post   = $total_posts - $post_number + 1;
        $newest_post    = $q[$total_posts - 1];

        $numbers = [
            \'post_number\'   => $post_number, 
            \'newest_post\'   => $newest_post, 
            \'total_posts\'   => $total_posts, 
            \'current_post\'  => $current_post 
        ];

        set_transient( $transient_id, $numbers, 7 * DAY_IN_SECONDS );
    }

    return $numbers;
}

add_action( \'transition_post_status\', function ( $new_status, $old_status, $post )
{

        global $wpdb;
        $wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE (\'_transient%_post_number_%\')" );
        $wpdb->query( "DELETE FROM $wpdb->options WHERE `option_name` LIKE (\'_transient_timeout%_post_number_%\')" );

}, 10, 3 );
单件。php

$a = get_display_post_number();
if( 7 === $a[\'current_post\'] ) { 

    next_post_link(\'%link\', \'%title\', TRUE);
    echo \'</br>\';

    $latest_post = get_post( $a[\'newest_post\'] );
    $post_link = get_permalink( $latest_post->ID );

    echo \'<a href="\' . $post_link . \'">\' . $latest_post->post_title . \'</a></br>\';

}elseif( 7 < $a[\'current_post\'] ) { 

    $latest_post = get_post( $a[\'newest_post\'] );
    $post_link = get_permalink( $latest_post->ID );

    echo \'<a href="\' . $post_link . \'">\' . $latest_post->post_title . \'</a></br>\';

}else{

    next_post_link(\'%link\', \'%title\', TRUE);
    echo \'</br>\';
    previous_post_link(\'%link\', \'%title\', TRUE);

}

结束

相关推荐

Show Pages in Categories

通过将此代码添加到函数中,我创建了category函数。php:function page_category() { register_taxonomy_for_object_type(\'category\', \'page\'); } // Add to the admin_init hook of your theme functions.php file add_action( \'init\', \'page_category\' ); 但问