web-dev-qa-db-fra.com

Page interrogée au lieu d'une taxonomie personnalisée

Lorsque j'essaie d'obtenir une archive pour une taxonomie personnalisée, WP recherche une page et ne trouve rien.

La mise en place

Mon code depuis le 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
        );
}

Maintenant, j'ai un article étiqueté avec magasin iTunes . En cliquant sur le lien vers /store/mac-store/, tous les articles de cette taxonomie devraient être listés. Et ça le fait! Sur un serveur local (Win7).
Sur le serveur de transfert (Debian avec des paramètres presque identiques), j’obtiens la page 404 (et l’en-tête 404 status).

Il n'y a pas de pages avec des noms similaires ou des slugs, pas même dans la corbeille. J'ai actualisé les permaliens plusieurs fois. Pas de plugins actifs. J’ai essayé Google mais je n’ai rien trouvé d’utile.

Débogage

J'ai ajouté le code suivant à mon functions.php pour suivre l'erreur:

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

Sortie locale, requête de travail

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,
))

Serveur intermédiaire de sortie, requête brisée

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,
))

Je sens que quelque chose d’évident me manque, mais je suis perdu pour le moment.

Mes questions sont donc les suivantes: comment puis-je faire en sorte que WP effectue une recherche dans les archives de taxonomie? Pourquoi cela fonctionne-t-il sur un serveur mais pas sur l'autre?

Mettre à jour

Les liens permanents sont définis sur /%year%/%postname%/ sur les deux serveurs et j'ai vidé les règles de réécriture le init par:

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

Mise à jour 2

utilisation du plugin Rewrite Analyzer de @ Jan Fabry J'ai comparé les règles de mon installation locale et du serveur de transfert. . Sur ce dernier, les règles sont absentes.

Réécrire les règles locales

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: ([^/]+)

Dois-je vraiment ajouter les règles manuellement? register_taxonomy() devrait normalement faire cela, non?

Workaround

Bah! J'ai utilisé une solution de contournement pour ajouter les règles de réécriture manquantes par 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 );
}

Important: Les nouvelles règles doivent précéder les règles de page. Changer l'ordre des arguments dans array_merge() ne résoudra pas le problème.

La question est toujours ouverte, car je viens de comprendre ce qui se passe ici.

2
fuxia

Avez-vous vidé les règles de réécriture?

0
scribu