私はかなり似た問題を抱えていました。前/次のナビゲーションからいくつかの投稿をソートして除外する必要がありました。@cfxのソリューションの問題は次のとおりでした:ajaxには対応していませんis_singular()
。wp-ajaxを介してコンテンツをロードすると、関数はfalseを返します。そのため、ページの読み込みには機能しましたが、ajaxによってコンテンツが変更されたときには機能しませんでした。global $post;
ここで私を助けていました。
これが私の解決策です:
/**
* WP: join postmeta to our sql query, so we can filter for custom fields
*
* @param $join
* @return string
*/
function jnz_adjacent_work_join( $join ) {
global $post;
if ( get_post_type( $post ) == 'work' ) {
global $wpdb;
return $join . "INNER JOIN $wpdb->postmeta AS m ON p.ID = m.post_id ";
}
return $join;
}
add_filter('get_previous_post_join', 'jnz_adjacent_work_join');
add_filter('get_next_post_join', 'jnz_adjacent_work_join');
/**
* WP: Change order of post for prev / next navigation
* exclude posts with custom field "not_clickable" set to true
*
* @param $where
* @param $operator
* @return string|void
*/
function jnz_adjacent_work_where( $where, $operator ) {
global $post;
if ( get_post_type( $post ) == 'work' ) :
global $wpdb;
$where = $wpdb->prepare("WHERE p.post_title {$operator} '%s' AND p.post_type = 'work' AND p.post_status = 'publish' AND (m.meta_key = 'not_clickable' AND (m.meta_key = 'not_clickable' AND m.meta_value != 1))", $post->post_title );
endif;
return $where;
}
$gt = '<';
$lt = '>';
add_filter( 'get_next_post_where', function( $where ) use ( $lt ) {
return jnz_adjacent_work_where( $where, $lt );
});
add_filter( 'get_previous_post_where', function( $where ) use ( $gt ) {
return jnz_adjacent_work_where( $where, $gt );
});
この場合、costumフィールドクエリは、cfがにnot_clickable
設定されているすべての投稿を除外しtrue
ます。
別の問題が発生しました:一部のコンテンツを作成し、その後、そのカスタムフィールドを実装しました。そのため、クエリは、trueまたはfalseに関係なく、そのフィールドが投稿に関連付けられていない投稿も除外しました。このタイプのフィルタリングを使用する場合は、その点に注意してください。すべての投稿に値があることを確認するか、SQL構文でこれを考慮してください。
get_adjacent_post
ます。関数のjoin / where / sort句をフィルタリングする必要があります。