【问题标题】:Wordpress: previous_post_link / next_post_link by alphabetical order?Wordpress:按字母顺序排列的previous_post_link / next_post_link?
【发布时间】:2012-04-13 01:54:46
【问题描述】:

我正在开发一个 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 以便我可以浏览帖子。但是,这是按帖子的时间顺序完成的,当然,我希望按照我在循环中使用的相同字母顺序来完成。对此问题的任何帮助将不胜感激。 提前致谢!

【问题讨论】:

标签: php wordpress custom-post-type alphabetical


【解决方案1】:

您可以通过在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 文件!

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

【讨论】:

  • Danbrellis 的答案缺少撇号。我无法发表评论,因为这是我的第一个帐户并且没有足够的代表发表评论。 remove_filter('get_previous_post_sort', mytheme_previous_post_orderby_name', 10);应该是remove_filter('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10);(但是即使有这个修复,我也无法让它工作)
  • plumbinator- 感谢您了解这一点。你在接近吗?如果你有一些示例代码,我很乐意看看。
  • OR p.post_status = 'private' 应该只适用于登录用户,不是吗?
  • 这不允许排除条款。
【解决方案2】:

看起来this plug-in 做了你想做的事,例如:

<ul class="pager">
        <?php previous_post_link_plus( array('order_by' => 'post_title') ); ?>
        <?php next_post_link_plus( array('order_by' => 'post_title') ); ?>
</ul>

【讨论】:

  • 这个插件已经有几年没有更新了,但它仍然很好用!!!有人应该再次对其进行测试,以便它可以返回到 wp 管理员中的可安装选项。我不得不从 wp 网站重新上传它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
相关资源
最近更新 更多