基本的にデフォルトのアーカイブウィジェットを拡張して、デフォルトの投稿の{month:year}リストを表示するだけでなく、私の新しいカスタム投稿タイプも含めるようにしています。
この例 から アーカイブリストに新しい{month:year}項目が表示されますが、クリックしても何も表示されません。
次に、 この例 では、カスタム投稿タイプのアイテムをループに含め、クリックして実際の結果を返す方法を示しました。
しかし、私が最後に抱えている問題は、リストの{month:year}項目をクリックすると、Pageエントリーからの結果も返すということです。私は自分の結果からページを除外する方法を知る必要があるので、それは単なる投稿タイプです。
Functions.phpにあるコードは次のとおりです。
/**
* Add custom Post Types to the Archives.
*/
add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 );
function ucc_getarchives_where_filter( $where , $r ) {
$args = array(
'public' => true ,
'_builtin' => false
);
$output = 'names';
$operator = 'and';
$post_types = get_post_types( $args , $output , $operator );
$post_types = array_merge( $post_types , array( 'post' ) );
$post_types = "'" . implode( "' , '" , $post_types ) . "'";
return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );
}
/**
* Add Custom Post Types to The Loop results.
*/
add_filter( 'request' , 'ucc_request_filter' );
function ucc_request_filter( $query ) {
// Preview does not like having post_type set; feed is my personal preference.
if ( empty( $query['preview'] ) && empty( $query['feed'] ) ) {
$my_post_type = $query['post_type'];
if ( empty( $my_post_type ) ) {
$query['post_type'] = 'any';
}
}
return $query;
}
置き換える:
return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );
と:
return str_replace( "post_type = 'post'" , "post_type = 'YOUR_CUSTOM_TYPE'" , $where );
そして、YOUR_CUSTOM_TYPEを実際のカスタム投稿タイプ名に変更します。
ページ以外のすべての型が必要な場合は、関数abitをこれに変更します。
add_filter( 'getarchives_where' , 'ucc_getarchives_where_filter' , 10 , 2 );
function ucc_getarchives_where_filter( $where , $r ) {
$args = array(
'public' => true ,
'_builtin' => false
);
$output = 'names';
$operator = 'and';
$post_types = get_post_types( $args , $output , $operator );
$post_types = array_merge( $post_types , array( 'post' ) );
$post_types = "'" . implode( "' , '" , $post_types ) . "'";
//if page is somewhere in the middle then remove it
$post_types = str_replace("'page',","", $post_types);
//if page is somewhere the last type then remove it
$post_types = str_replace("'page'","", $post_types);
return str_replace( "post_type = 'post'" , "post_type IN ( $post_types )" , $where );
}
そしてループの中で結果を得るためにこれを使います:
add_filter( 'pre_get_posts' , 'ucc_include_custom_post_types' );
function ucc_include_custom_post_types( $query ) {
global $wp_query;
/* Don't break admin or preview pages. This is also a good place to exclude feed with !is_feed() if desired. */
if ( !is_preview() && !is_admin() && !is_singular() ) {
$args = array(
'public' => true ,
'_builtin' => false
);
$output = 'names';
$operator = 'and';
$post_types = get_post_types( $args , $output , $operator );
$post_types = array_merge( $post_types , array( 'post' ) );
//remove page form array:
foreach($post_types as $key => $val){
if ($val =='page'){
unset($post_types[$key]);
}
}
if ($query->is_feed) {
/* Do feed processing here if you did not exclude it previously. This if/else
* is not necessary if you want custom post types included in your feed.
*/
} else {
$my_post_type = get_query_var( 'post_type' );
if ( empty( $my_post_type ) )
$query->set( 'post_type' , $post_types );
}
}
return $query;
}