web-dev-qa-db-fra.com

add_rewrite_rule ne charge pas la page correcte ne récupère pas les variables

J'ai essayé d'obtenir un titre de showreel et un identifiant de vidéo dans une URL accessible par la page.

j'ai les deux dans la même URL et cela ne fonctionne pas ou un seul entre. Actuellement, la page n'est pas trouvée? (Je rince constamment les permaliens)

Je souhaite obtenir des variables qui ressembleront à directeurs/test-director/showreel / nom-showreel / vidéo / 111 /

Le site se trouve actuellement dans un dossier de test appelé independent_02 mais vous ne savez pas si cela affecte quelque chose?

voici le code;

function wpse13483_init() {

    add_rewrite_rule( 'directors/(.+?)/showreels/([^/]+)?/?$', 'index.php?category_name=$matches[1]&showreel=a', 'top' );
    add_rewrite_rule( 'directors/(.+?)/showreels/([^/]+)/video/([^/]+)?/?$', 'index.php?category_name=$matches[1]&showreel=c1&video=c2', 'top' );
    // directors is a custom post_type and should go to single-directors.php

    add_rewrite_rule( 'showreels/(.+?)/video/([^/]+)?/?$', 'index.php?category_name=$matches[1]&video=b', 'top' );
    // showreels is a custom post_type and should go to single-showreels.php

}
add_action( 'init', 'wpse13483_init' );

Toute aide appréciée!


UPDATES- cette règle fonctionne à présent principalement et intercepte les variables. Cependant, il va archiver.php et non director-single.php?

add_rewrite_rule( 'directors/(.+?)/showreels/([^/]*)/video/([^/]*)/?', 'index.php?post_type=directors&showreel=$matches[2]&video=$matches[3]', 'top' );
// directors is a custom post_type and should go to single-directors.php

je pense que c'est à voir avec '? post_type = director' mais je ne trouve aucune référence à ce que cela devrait être de charger single.php

UPDATE 2 En regardant Rewrite analyzeri pense qu'il manque la variable post_type? rules

4
v3nt

Cela semble fonctionner!

? post_type = directeurs & nom = $ correspond [1] semble être la clé

add_rewrite_rule( 'directors/([^/]*)/showreels/([^/]*)/video/([^/]*)/?', 'index.php?post_type=directors&name=$matches[1]&showreel=$matches[2]&video=$matches[3]', 'top' );

code final donc maintenant;

function wpse13483_init() {

    add_rewrite_rule( 'directors/([^/]*)/showreels/([^/]*)/video/([^/]*)/?', 'index.php?post_type=directors&name=$matches[1]&showreel=$matches[2]&video=$matches[3]', 'top' );

}
add_action( 'init', 'wpse13483_init' );

function wpa52794_query_vars( $vars) {
    $vars[] = 'video';
    $vars[] = 'showreel';

    return $vars;
}
add_filter( 'query_vars', 'wpa52794_query_vars' );
2
v3nt

WordPress supprimera les variables de requête qu'il ne comprend pas par défaut. Ainsi, en plus d'enregistrer vos règles de réécriture personnalisées, vous également devez enregistrer vos variables de requête personnalisées.

add_filter( 'query_vars', 'wpa52794_query_vars' );
function wpa52794_query_vars( $vars ) {
    $vars[] = 'video';
    $vars[] = 'showreel';

    return $vars;
}

Juste pour compléter la réponse, vous devez également spécifier les variables de requête habituelles attendues par WordPress. Votre exemple initial ne transmet pas le post_type ni rien qui identifie le message (ID, nom, slug, etc.) comme vous l'avez déjà noté dans vos propres commentaires Sans cela, WordPress ne comprend pas comment router la demande en interne.

Félicitations pour avoir découvert cela avec un analyseur de réécriture. C'était bien la pièce manquante.

2
EAMann

En plus de la réponse de @EAMann, je peux dire que vous devez effacer les règles de réécriture.

@EAMann answer :

add_filter( 'query_vars', 'wpa52794_query_vars' );
function wpa52794_query_vars( $vars) {
    $vars[] = 'video';
    $vars[] = 'showreel';

    return $vars;
}

Règles de réécriture Flushing :

function myplugin_activation() {
    flush_rewrite_rules();
}
register_activation_hook ( __FILE__, 'myplugin_activation' );

function myplugin_deactivation() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivation' );
0
Eugene Manuilov