web-dev-qa-db-ja.com

カスタム投稿タイプのアーカイブ(ページなし)

基本的にデフォルトのアーカイブウィジェットを拡張して、デフォルトの投稿の{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;
}
1
Ian

置き換える:

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;
}
2
Bainternet