web-dev-qa-db-ja.com

カスタム分類法の代わりに照会されたページ

カスタム分類のアーカイブを取得しようとすると、WPがページを検索しても何も見つかりません。

セットアップ

Functions.phpから私のコード:

add_action( 'init', 'register_store_taxonomy' );

function register_store_taxonomy()
{
    $args = array (
        'hierarchical'      => TRUE
    ,   'label'             => 'Store'
    ,   'public'            => TRUE
    ,   'query_var'         => 'store'
    ,   'rewrite'           => TRUE
    ,   'show_in_nav_menus' => TRUE
    ,   'show_ui'           => TRUE
    );
    register_taxonomy(
            'store'
        ,   array ( 'post', 'page' )
        ,   $args
        );
}

今私はstoreiTunesでタグ付けされた投稿を持っています。 /store/mac-store/へのリンクをクリックすると、この分類法のすべての投稿をリストするはずです。そしてそれはします!ローカルサーバー上(Win7).
しかし、ステージングサーバー(ほぼ同じ設定のDebian)では、404ページ(および404ステータスヘッダー)が表示されます。

ゴミ箱の中にさえも、類似の名前やナメクジのページはありません。パーマリンクを数回更新しました。アクティブなプラグインはありません。私はGoogleを試しましたが、何も役に立つとは思えませんでした。

デバッグ

エラーを追跡するために、functions.phpに次のコードを追加しました。

add_action( 'wp_footer', 'dump_query' );
function dump_query()
{
    if ( current_user_can( 'edit_posts' ) )
    {
        pre_dump( $GLOBALS['wp_query'] );
    }
}

function pre_dump( $var, $print = TRUE )
{
    $out = '<pre class="vardump">' . htmlspecialchars( var_export( $var, TRUE ) ) . '</pre>';

    if ( ! $print )
        return $out;

    print $out;
}

ローカルの作業用クエリを出力する

WP_Query::__set_state(array(
   'query_vars' => 
  array (
    'store' => 'iTunes',
    'error' => '',
    'm' => 0,
    'p' => 0,
    'post_parent' => '',
    'subpost' => '',
    'subpost_id' => '',
    'attachment' => '',
    'attachment_id' => 0,
    'name' => '',
    'static' => '',
    'pagename' => '',
    'page_id' => 0,
    'second' => '',
    'minute' => '',
    'hour' => '',
    'day' => 0,
    'monthnum' => 0,
    'year' => 0,
    'w' => 0,
    'category_name' => '',
    'tag' => '',
    'cat' => '',
    'tag_id' => '',
    'author_name' => '',
    'feed' => '',
    'tb' => '',
    'paged' => 0,
    'comments_popup' => '',
    'meta_key' => '',
    'meta_value' => '',
    'preview' => '',
    's' => '',
    'sentence' => '',
    'fields' => '',
    'category__in' => 
    array (
    ),
    'category__not_in' => 
    array (
    ),
    'category__and' => 
    array (
    ),
    'post__in' => 
    array (
    ),
    'post__not_in' => 
    array (
    ),
    'tag__in' => 
    array (
    ),
    'tag__not_in' => 
    array (
    ),
    'tag__and' => 
    array (
    ),
    'tag_slug__in' => 
    array (
    ),
    'tag_slug__and' => 
    array (
    ),
    'meta_query' => 
    array (
    ),
    'ignore_sticky_posts' => false,
    'suppress_filters' => false,
    'cache_results' => true,
    'update_post_term_cache' => true,
    'update_post_meta_cache' => true,
    'post_type' => '',
    'posts_per_page' => 10,
    'nopaging' => false,
    'comments_per_page' => '50',
    'no_found_rows' => false,
    'taxonomy' => 'store',
    'term' => 'iTunes',
    'order' => 'DESC',
    'orderby' => 'wp_posts.post_date DESC',
  ),
   'tax_query' => 
  WP_Tax_Query::__set_state(array(
     'queries' => 
    array (
      0 => 
      array (
        'taxonomy' => 'store',
        'terms' => 
        array (
          0 => 'iTunes',
        ),
        'include_children' => true,
        'field' => 'slug',
        'operator' => 'IN',
      ),
    ),
     'relation' => 'AND',
  )),
   'post_count' => 1,
   'current_post' => -1,
   'in_the_loop' => false,
   'comment_count' => 0,
   'current_comment' => -1,
   'found_posts' => '1',
   'max_num_pages' => 1,
   'max_num_comment_pages' => 0,
   'is_single' => false,
   'is_preview' => false,
   'is_page' => false,
   'is_archive' => true,
   'is_date' => false,
   'is_year' => false,
   'is_month' => false,
   'is_day' => false,
   'is_time' => false,
   'is_author' => false,
   'is_category' => false,
   'is_tag' => false,
   'is_tax' => true,
   'is_search' => false,
   'is_feed' => false,
   'is_comment_feed' => false,
   'is_trackback' => false,
   'is_home' => false,
   'is_404' => false,
   'is_comments_popup' => false,
   'is_paged' => false,
   'is_admin' => false,
   'is_attachment' => false,
   'is_singular' => false,
   'is_robots' => false,
   'is_posts_page' => false,
   'is_post_type_archive' => false,
   'parsed_tax_query' => true,
   'query' => 
  array (
    'store' => 'iTunes',
  ),
   'request' => ' SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( wp_term_relationships.term_taxonomy_id IN (135,134,133,132,131,130,129,128,125) ) AND wp_posts.post_type IN (\'post\', \'page\', \'attachment\') AND (wp_posts.post_status = \'publish\' OR wp_posts.post_author = 7 AND wp_posts.post_status = \'private\') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10',
   'posts' => 
  array ( /* cut out */),
   'queried_object' => 
  stdClass::__set_state(array(
     'term_id' => '124',
     'name' => 'iTunes',
     'slug' => 'iTunes',
     'term_group' => '0',
     'term_taxonomy_id' => '125',
     'taxonomy' => 'store',
     'description' => '',
     'parent' => '0',
     'count' => '1',
  )),
   'queried_object_id' => 124,
))

出力ステージングサーバー、破損したクエリ

WP_Query::__set_state(array(
   'query_vars' => 
  array (
    'page' => 0,
    'pagename' => 'iTunes',
    'error' => '',
    'm' => 0,
    'p' => 0,
    'post_parent' => '',
    'subpost' => '',
    'subpost_id' => '',
    'attachment' => '',
    'attachment_id' => 0,
    'name' => 'iTunes',
    'static' => '',
    'page_id' => 0,
    'second' => '',
    'minute' => '',
    'hour' => '',
    'day' => 0,
    'monthnum' => 0,
    'year' => 0,
    'w' => 0,
    'category_name' => '',
    'tag' => '',
    'cat' => '',
    'tag_id' => '',
    'author_name' => '',
    'feed' => '',
    'tb' => '',
    'paged' => 0,
    'comments_popup' => '',
    'meta_key' => '',
    'meta_value' => '',
    'preview' => '',
    's' => '',
    'sentence' => '',
    'fields' => '',
    'category__in' => 
    array (
    ),
    'category__not_in' => 
    array (
    ),
    'category__and' => 
    array (
    ),
    'post__in' => 
    array (
    ),
    'post__not_in' => 
    array (
    ),
    'tag__in' => 
    array (
    ),
    'tag__not_in' => 
    array (
    ),
    'tag__and' => 
    array (
    ),
    'tag_slug__in' => 
    array (
    ),
    'tag_slug__and' => 
    array (
    ),
    'ignore_sticky_posts' => false,
    'suppress_filters' => false,
    'cache_results' => true,
    'update_post_term_cache' => true,
    'update_post_meta_cache' => true,
    'post_type' => '',
    'posts_per_page' => 10,
    'nopaging' => false,
    'comments_per_page' => '50',
    'no_found_rows' => false,
    'order' => 'DESC',
    'orderby' => 'wp_posts.post_date DESC',
  ),
   'tax_query' => 
  WP_Tax_Query::__set_state(array(
     'queries' => 
    array (
    ),
     'relation' => 'AND',
  )),
   'post_count' => 0,
   'current_post' => -1,
   'in_the_loop' => false,
   'comment_count' => 0,
   'current_comment' => -1,
   'found_posts' => 0,
   'max_num_pages' => 0,
   'max_num_comment_pages' => 0,
   'is_single' => false,
   'is_preview' => false,
   'is_page' => false,
   'is_archive' => false,
   'is_date' => false,
   'is_year' => false,
   'is_month' => false,
   'is_day' => false,
   'is_time' => false,
   'is_author' => false,
   'is_category' => false,
   'is_tag' => false,
   'is_tax' => false,
   'is_search' => false,
   'is_feed' => false,
   'is_comment_feed' => false,
   'is_trackback' => false,
   'is_home' => false,
   'is_404' => true,
   'is_comments_popup' => false,
   'is_paged' => false,
   'is_admin' => false,
   'is_attachment' => false,
   'is_singular' => false,
   'is_robots' => false,
   'is_posts_page' => false,
   'is_post_type_archive' => false,
   'parsed_tax_query' => true,
   'query' => 
  array (
    'page' => '',
    'pagename' => 'store/iTunes',
  ),
   'request' => ' SELECT   wp_posts.* FROM wp_posts  WHERE 1=1  AND (wp_posts.ID = \'0\') AND wp_posts.post_type = \'page\'  ORDER BY wp_posts.post_date DESC ',
   'posts' => 
  array (
  ),
   'queried_object' => NULL,
   'queried_object_id' => 0,
))

明白なことを見逃しているように感じますが、今は負けています。

だから私の質問は:どのように私はWPに分類アーカイブを検索させることができますか?一方のサーバーでは機能しますが、もう一方のサーバーでは機能しません。

更新

パーマリンクは両方のサーバで/%year%/%postname%/に設定されており、私はinit perの書き換えルールをフラッシュしました。

$GLOBALS['wp_rewrite']->flush_rules();

アップデート2

@Jan Fabryから Rewrite Analyzerプラグイン を使ってステージングサーバー上。後者では、規則はありません。

ローカルの書き換え規則

store/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$            store: ([^/]+)
           feed: (feed|rdf|rss|rss2|atom)
store/([^/]+)/(feed|rdf|rss|rss2|atom)/?$             store: ([^/]+)
           feed: (feed|rdf|rss|rss2|atom)
store/([^/]+)/page/?([0-9]{1,})/?$            store: ([^/]+)
          paged: ([0-9]{1,})
store/([^/]+)/?$              store: ([^/]+)

本当に手動でルールを追加する必要がありますか?通常register_taxonomy()はそれをするべきです、それはすべきではありませんか?

Workaround

バー!私は回避策を使ってfunctions.phpごとに足りない書き換え規則を追加しました。

add_action( 'init', 'add_taxrules_manually' );
function add_taxrules_manually()
{
    $tax           = 'store';
    $rewrite_rules = get_option( 'rewrite_rules' );

    if ( isset ( $rewrite_rules[ $tax . '/([^/]+)/?$' ] ) )
    {
        return;
    }

    $new_rules = array (
        $tax . '/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$' => 'index.php?' . $tax . '=$matches[1]&feed=$matches[2]',
        $tax . '/([^/]+)/(feed|rdf|rss|rss2|atom)/?$'      => 'index.php?' . $tax . '=$matches[1]&feed=$matches[2]',
        $tax . '/([^/]+)/page/?([0-9]{1,})/?$'             => 'index.php?' . $tax . '=$matches[1]&paged=$matches[2]',
        $tax . '/([^/]+)/?$'                               => 'index.php?' . $tax . '=$matches[1]',
    );

    $update = array_merge( $new_rules, $rewrite_rules );
    update_option( 'rewrite_rules', $update );
}

重要:新しい規則はページ規則の前にくる必要があります。 array_merge()の引数の順序を変更しても修正されません。

ここで何が起こるのか理解するためにhaveを持っているだけなので、この質問は未解決です。

2
fuxia

書き換えルールをフラッシュしましたか?

0
scribu