La plupart des travaux ci-dessous proviennent d'une question précédente/réponse acceptée . J'essaie d'obtenir la structure permalien suivante:
/listings/
/listings/page/2/
/listings/%state%/
/listings/%state%/page/2/
/listings/%state%/property/post-title/
Je pensais que cela allait être une tâche simple, mais je continue à rencontrer de plus en plus de problèmes. Actuellement, tout ce qui précède fonctionne sauf la pagination .
Ma réécriture après le type (cpt_listings
) ressemble à ceci:
'rewrite' => array( 'slug' => 'listings/%tax_states%/property', 'with_front' => false )
Ma taxonomie (tax_states
) réécrit ressemble à ceci:
'rewrite' => array( 'slug' => 'listings', 'with_front' => false, 'hierarchical' => true )
J'utilise cette fonction pour remplacer %state%
par le terme de taxonomie actuel:
/** Process the State Taxonomy Permalink Tag **/
function state_permalink( $permalink, $post_id, $leavename ) {
if( false === strpos( $permalink, '%tax_states%' ) ) {
return $permalink;
}
// Get post
$post = get_post( $post_id );
if( empty( $post ) ) {
return $permalink;
}
// Get taxonomy terms
$terms = wp_get_object_terms( $post->ID, 'tax_states' );
if( ! is_wp_error( $terms ) && ! empty( $terms ) && is_object( $terms[0] ) ) {
$taxonomy_slug = $terms[0]->slug;
} else {
$taxonomy_slug = 'united-states';
}
return str_replace( '%tax_states%', $taxonomy_slug, $permalink );
}
add_filter('post_link', 'state_permalink', 10, 3);
add_filter('post_type_link', 'state_permalink', 10, 3);
Enfin, j'ai ces réécritures personnalisées en place:
/** Rewrites to allow our permalinks to work **/
/** This fixes `/listings/%tax_states%/` **/
/** This fixes `listings/%tax_states%/property/post-title/` **/
function type_tax_rewrites( $rules ) {
$new = array();
$new['listings/([^/]+)/property/(.+)/?$'] = 'index.php?cpt_listings=$matches[2]';
$new['listings/(.+)/?$'] = 'index.php?tax_states=$matches[1]';
return array_merge( $new, $rules ); // Ensure our rules come first
}
add_filter( 'rewrite_rules_array', 'type_tax_rewrites' );
Étant donné que tout ce qui précède fonctionne en dehors de la pagination, j'ai l'impression de faire quelque chose de mal ici. J'ai presque l'impression que WordPress devrait gérer les réécritures et je n'aurais pas besoin de réécrire tous les scénarios.
J'ai imprimé mon $wp_query
dans un crochet template_redirect
pour voir quelles sont les variables de requête et celles qui restent:
[tax_states] => 2,
[paged] => 0,
Donc, tax_states
prend la variable paginée et je me suis amusée à la réécrire, mais je ne connais pas le fonctionnement du système de réécriture et, comme je l’ai dit plus haut, il me semble que je fais quelque chose de mal si je dois même réécrire pour la pagination. Voici les combinaisons de réécriture que j'ai ajoutées au hook rewrite_rules_array
ci-dessus:
$new['listings/page/([0-9]+)/?$'] = 'index.php?paged=$matches[1]';
$new['listings/page/([0-9]+)/?$'] = 'index.php?tax_states=$matches[1]';
Aucune de ces réponses ne semble faire la différence, la pagination conduit toujours à 404.
Le cœur de ma question est
Grâce à l'aide de Milo, le code de la question a fini par fonctionner: permaliens fixés et la structure est restée exactement telle que je l'avais décrite dans la question ci-dessus.
rewrite_rules_array
'hierarchical' => false
D'après ma compréhension limitée du fonctionnement de ce dernier, Milo décrivait que les réécritures WordPress intégrées qui gèrent les taxonomies hiérarchiques interfèrent avec la structure que j'essayais de réaliser. Je ne peux que supposer à cause des réécritures /parent-term/child-term/
. La variable tag
intégrée correspond déjà à la structure que je cherchais, raison pour laquelle les systèmes non hiérarchiques finissent par fonctionner.