6

ループ内でアルファベット順に並べられたカスタム投稿を含むワードプレス Web サイトを開発しています。

<!-- 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 に答える