6

我正在开发一个带有自定义帖子的 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(); ?>

没有什么特别的,只是一个正常的循环。

当我打开一个帖子时,在它的页面中我有通常的 previous_post_link 和 next_post_link 以便我可以浏览帖子。但是,这是按帖子的时间顺序完成的,当然,我希望按照我在循环中使用的相同字母顺序来完成。对此问题的任何帮助将不胜感激。提前致谢!

4

2 回答 2

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>
于 2012-06-15T19:59:10.807 回答
4

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 );
}

然后在您的 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);

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

if($post->post_type == 'my_custom_post_type'){
    add_filter(...);
    the_post_navigation();
    remove_filter(...);
}

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

这对我很有用,但如果您打算将其与同一学期的帖子结合起来,可能会有一些限制......

于 2015-09-18T14:19:27.357 回答