使用PERVICE_POST_LINK和NEXT_POST_LINK绕过POST序列

时间:2013-03-04 作者:boomturn

对于单个自定义帖子类型,我使用带有简单箭头的上一个\\u post\\u链接和下一个\\u post\\u链接。(虽然此处显示了文本箭头,但实际上我使用的是通过CSS隐藏文本的图形。)代码:

<nav class="arrowNav">
    <div class="nav-previous">
       <?php previous_post_link(\'%link\', \'«\'); ?>
    </div>

    <div class="nav-next">
       <?php next_post_link(\'%link\', \'»\'); ?>
    </div>
</nav>
这可以很好地工作,除了边缘情况。我想让帖子环绕起来:也就是说,对于第一篇帖子,我希望previous\\u post\\u link链接到最后一篇帖子,对于最后一篇帖子,next\\u post\\u link链接到第一篇帖子。这两种情况下的默认值都为null。如何测试第一个和最后一个帖子的状态,并为每个帖子生成链接?

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

在函数中添加以下自定义函数。php文件,而不是调用previous\\u post\\u link和next\\u post\\u link函数,分别调用custom\\u next\\u post\\u link和custom\\u previous\\u post\\u link自定义函数。

 function custom_adjacent_post_link( $format, $link, $in_same_cat = false, $excluded_categories = \'\', $previous = true ) {
if ( $previous && is_attachment() )
        $post = get_post( get_post()->post_parent );
else
        $post = get_adjacent_post( $in_same_cat, $excluded_categories, $previous );

if ( ! $post ) {            
    $post =  \'\';
    $args = \'posts_per_page=1&orderby=date&ignore_sticky_posts=1\';

    if($previous)
        $args .= \'&order=DESC\';
    else
        $args .= \'&order=ASC\';

   $the_query = new WP_Query( $args );
    while ( $the_query->have_posts() ) :
         $the_query->the_post();
         $post = get_post(get_the_ID());   
    endwhile;
    wp_reset_postdata();
} 

$title = $post->post_title;

if ( empty( $post->post_title ) )
        $title = $previous ? __( \'Previous Post\' ) : __( \'Next Post\' );

$title = apply_filters( \'the_title\', $title, $post->ID );
$date = mysql2date( get_option( \'date_format\' ), $post->post_date );
$rel = $previous ? \'prev\' : \'next\';

$string = \'<a href="\' . get_permalink( $post ) . \'" rel="\'.$rel.\'">\';
$inlink = str_replace( \'%title\', $title, $link );
$inlink = str_replace( \'%date\', $date, $inlink );
$inlink = $string . $inlink . \'</a>\';

$output = str_replace( \'%link\', $inlink, $format );
$adjacent = $previous ? \'previous\' : \'next\';
echo apply_filters( "{$adjacent}_post_link", $output, $format, $link, $post );
}
function custom_previous_post_link($format=\'&laquo; %link\', $link=\'%title\', $in_same_cat = false, $excluded_categories = \'\') {
custom_adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, true);
}
function custom_next_post_link($format=\'%link &raquo;\', $link=\'%title\', $in_same_cat = false, $excluded_categories = \'\') {
custom_adjacent_post_link($format, $link, $in_same_cat, $excluded_categories, false);
}

SO网友:Doug Cassidy

接受的答案是可行的,但可能应该使用get\\u posts()而不是整个wpquery和循环:

    if ( ! $post ) { 
    $args = array(\'posts_per_page\'=> 1,
            \'orderby\'=> \'date\',
            \'ignore_sticky_posts\' => 1
            );
    if($previous)
        $args[\'order\']=\'DESC\';
    else
       $args[\'order\']=\'ASC\';
    $adjposts = get_posts($args);
    $post = $adjposts[0];   
} 
如果不需要,通常不赞成使用wpquery。否则,要完全归功于维诺德·达尔维。

结束

相关推荐

Only on single post page

我正在使用此代码在单个帖子下面显示广告,但仅当它位于指定类别时。代码正在发布,但它也显示在归档页面上。我只想在单个贴子页面上显示。function demo_link() { if (in_category(\'themes\')) { ?> Some code <?php } else { ?> Some code <?php } }