Wordpress: предыдущая_пост_линка / следующая_пост_линка по алфавиту? - PullRequest
6 голосов
/ 29 марта 2012

Я разрабатываю веб-сайт 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(); ?>

Ничего особенного, просто нормальный цикл.

Когда я открываю сообщение, на его странице появляются обычные предыдущие_пост_линки и следующие_пост_линки, чтобы я мог перемещаться по сообщениям. Однако это делается в хронологическом порядке постов, и я хочу сделать это в том же алфавитном порядке, что и в цикле, конечно. Любая помощь в этом вопросе будет очень признателен. Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 15 июня 2012

Похоже, этот плагин делает то, что вы ищете, например:

<ul class="pager">
        <?php previous_post_link_plus( array('order_by' => 'post_title') ); ?>
        <?php next_post_link_plus( array('order_by' => 'post_title') ); ?>
</ul>
4 голосов
/ 18 сентября 2015

Вы можете сделать это, используя фильтры в функции 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(...);
}

или, вы можете просто использовать файл single.php, специфичный для post_type!

Это отлично сработало для меня, но могут быть некоторые ограничения, если вы планируете комбинировать это с постами в одном и том же термине ...

0 голосов
/ 30 октября 2014

Этот плагин не обновлялся годами, не уверен, что он все еще работает.В случае, если это не так, я придумал решение , которое можно добавить в ваш functions.phpНадеюсь, это поможет!

...