Wordpress:previous_post_link/next_post_link按字母顺序排列?

Cth*_*lhu 6 php wordpress alphabetical custom-post-type

我正在开发一个带有自定义帖子的wordpress网站,这些帖子按循环中的字母顺序排序.

<!-- THE ARGS -->
<?php global $query_string;
$args = wp_parse_args($query_string);
$args = array(
    'post_type' => 'custom_post',
    'orderby' => 'title',
    'order' => 'ASC',
    'posts_per_page' => -1,
    ); ?>

<!--  THE LOOP -->
<?php $wp_query = new WP_Query( $args ); ?>
<?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
Run Code Online (Sandbox Code Playgroud)

那里没什么好看的,只是一个正常的循环.

当我打开帖子时,在其页面中我有通常的previous_post_link和next_post_link,所以我可以浏览帖子.但是,这是通过帖子的时间顺序来完成的,我希望按照我在循环中使用的字母顺序进行操作.对此事的任何帮助将非常感激.提前致谢!

phi*_*ith 6

看起来这个插件可以满足您的需求,例如:

<ul class="pager">
        <?php previous_post_link_plus( array('order_by' => 'post_title') ); ?>
        <?php next_post_link_plus( array('order_by' => 'post_title') ); ?>
</ul>
Run Code Online (Sandbox Code Playgroud)


dan*_*lis 5

您可以通过在get_adjacent_post函数中使用过滤器来做到这一点。

在你的functions.php文件中,添加:

function mytheme_previous_post_orderby_name($orderby){
    return "ORDER BY p.post_title DESC LIMIT 1";
}
function mytheme_previous_post_where_name(){
    global $post, $wpdb;
    return $wpdb->prepare( "WHERE p.post_title < %s AND p.post_type = %s AND ( p.post_status = 'publish' OR p.post_status = 'private' )", $post->post_title, $post->post_type );
}
function mytheme_next_post_orderby_name($orderby){
    return "ORDER BY p.post_title ASC LIMIT 1";
}
function mytheme_next_post_where_name(){
    global $post, $wpdb;
    return $wpdb->prepare( "WHERE p.post_title > %s AND p.post_type = %s AND ( p.post_status = 'publish' OR p.post_status = 'private' )", $post->post_title, $post->post_type );
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 single.php 页面中添加过滤器,然后再调用上一篇/下一篇文章链接函数:

add_filter('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10, 1);
add_filter('get_next_post_sort', 'mytheme_next_post_orderby_name', 10, 1);

add_filter('get_previous_post_where', 'mytheme_previous_post_where_name', 10);
add_filter('get_next_post_where', 'mytheme_next_post_where_name', 10);

the_post_navigation();

remove_filter('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10);
remove_filter('get_next_post_sort', 'mytheme_next_post_orderby_name', 10);
remove_filter('get_previous_post_where', 'mytheme_previous_post_where_name', 10);
remove_filter('get_next_post_where', 'mytheme_next_post_where_name', 10);
Run Code Online (Sandbox Code Playgroud)

如果您想检查特定的 post_type,您可以在添加过滤器部分添加 if :

if($post->post_type == 'my_custom_post_type'){
    add_filter(...);
    the_post_navigation();
    remove_filter(...);
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以只使用 post_type 特定的 single.php 文件!

这对我来说非常有用,但如果您计划将其与同一学期的帖子结合起来,可能会有一些限制......