Lorsque j'essaie d'obtenir une archive pour une taxonomie personnalisée, WP recherche une page et ne trouve rien.
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.
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;
}
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,
))
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?
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();
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.
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?
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.
Avez-vous vidé les règles de réécriture?