web-dev-qa-db-ja.com

次/前の投稿リンク:アルファベット順および同じカテゴリから

Next PostとPrevious Post Linksを通常のSingle Postとは異なる方法で提供する方法を徹底的に探しています。

デフォルトでは、:

  • 年代順です

  • すべてのブログカテゴリからの投稿へのリンク

しかし、私はそれが必要:

  • アルファベット順

  • 同じカテゴリの投稿にのみリンクしています

私は開発者ではありませんが、以下の2つのコードをマージできれば問題は解決すると思います。

CODE 1 - 次へ/前へのリンクをアルファベット順にする。ただし、同じカテゴリに属していない( source

function filter_next_post_sort($sort) {
    $sort = "ORDER BY p.post_title ASC LIMIT 1";
    return $sort;
}
function filter_next_post_where($where) {
    global $post, $wpdb;
    return $wpdb->prepare("WHERE p.post_title > '%s' AND p.post_type = '". get_post_type($post)."' AND p.post_status = 'publish'",$post->post_title);
}

function filter_previous_post_sort($sort) {
    $sort = "ORDER BY p.post_title DESC LIMIT 1";
    return $sort;
}
function filter_previous_post_where($where) {
    global $post, $wpdb;
    return $wpdb->prepare("WHERE p.post_title < '%s' AND p.post_type = '". get_post_type($post)."' AND p.post_status = 'publish'",$post->post_title);
}

add_filter('get_next_post_sort',   'filter_next_post_sort');
add_filter('get_next_post_where',  'filter_next_post_where');

add_filter('get_previous_post_sort',  'filter_previous_post_sort');
add_filter('get_previous_post_where', 'filter_previous_post_where');

CODE 2 - 同じカテゴリの次へ/前へのリンクを表示しますが、アルファベット順には表示しません( source

add_filter( 'get_next_post_join', 'navigate_in_same_taxonomy_join', 20);
add_filter( 'get_previous_post_join', 'navigate_in_same_taxonomy_join', 20 );
function navigate_in_same_taxonomy_join() {
 global $wpdb;
 return " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
}


add_filter( 'get_next_post_where' , 'navigate_in_same_taxonomy_where' );
add_filter( 'get_previous_post_where' , 'navigate_in_same_taxonomy_where' );
function navigate_in_same_taxonomy_where( $original ) {
 global $wpdb, $post;
 $where = '';
 $taxonomy   = 'category';
 $op = ('get_previous_post_where' == current_filter()) ? '<' : '>';
 $where = $wpdb->prepare( "AND tt.taxonomy = %s", $taxonomy );
 if ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) )
 return $original ;

 $term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );

 $term_array = array_map( 'intval', $term_array );

 if ( ! $term_array || is_wp_error( $term_array ) )
 return $original ;

 $where = " AND tt.term_id IN (" . implode( ',', $term_array ) . ")";
 return $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' $where", $post->post_date, $post->post_type );
}

助けてくれてありがとう!

2
Dormiu

Next/prev投稿を取得するために必要なことは、next/prev投稿がget next/prev投稿関数の同じ分類用語に含まれることを示すパラメータを_trueに設定することです。フィルタ。

例えば:

Nextとprevの投稿オブジェクトを取得するには:

// First parameter for these functions indicates
// if next/prev post should be in the same taxonomy term
// More in https://codex.wordpress.org/Function_Reference/get_next_post
// And https://codex.wordpress.org/Function_Reference/get_previous_post
$prev_post = get_previous_post(true);
$next_post = get_next_post(true);

前/次の投稿リンクを印刷するには

// Third parameter for these functions indicates
// if next/prev post should be in the same taxonomy term
// More in https://codex.wordpress.org/Template_Tags/next_post_link
// And https://codex.wordpress.org/Template_Tags/previous_post_link
previous_post_link( '&laquo; %link', '%title', true );
next_post_link( '%link &raquo;', '%title', true );

問題は、whereステートメントをフィルター処理して順序を変更すると、同じ分類部分が変更されるため、再構築する必要があることです。

このコードは動作するはずです(私はテストしていません)。

add_filter('get_next_post_sort',  'filter_next_and_prev_post_sort');
add_filter('get_previous_post_sort',  'filter_next_and_prev_post_sort');
function filter_next_and_prev_post_sort($sort) {
    $op = ('get_previous_post_sort' == current_filter()) ? 'DESC' : 'ASC';
    $sort = "ORDER BY p.post_title ".$op ." LIMIT 1";
    return $sort;

}

add_filter( 'get_next_post_join', 'navigate_in_same_taxonomy_join', 20);
add_filter( 'get_previous_post_join', 'navigate_in_same_taxonomy_join', 20 );
function navigate_in_same_taxonomy_join() {
  global $wpdb;
  return " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
}

add_filter( 'get_next_post_where' , 'filter_next_and_prev_post_where' );
add_filter( 'get_previous_post_where' , 'filter_next_and_prev_post_where' );
function filter_next_and_prev_post_where( $original ) {
  global $wpdb, $post;
  $where = '';
  $taxonomy   = 'category';
  $op = ('get_previous_post_where' == current_filter()) ? '<' : '>';

  if ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {
    return $original ;
  }

  $term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );

  $term_array = array_map( 'intval', $term_array );

  if ( ! $term_array || is_wp_error( $term_array ) ) {
    return $original;
  }
  $where = " AND tt.term_id IN (" . implode( ',', $term_array ) . ")";
  return $wpdb->prepare( "WHERE p.post_title $op %s AND p.post_type = %s AND p.post_status = 'publish' $where", $post->post_title, $post->post_type );
}
3
cybmeta