web-dev-qa-db-fra.com

add_rewrite_rule fonctionne dans la fonction themes php mais cesse de fonctionner une fois installé dans le plugin

Comme indiqué dans le titre, ce code fonctionne dans le fichier php de mes fonctions dans le thème enfant actif. Je n'ai pas grand-chose installé, car il est développé dans une installation de Vanilla WP.

voici le code que j'utilise ...

add_action('init', 'foo_add_rewrite_rule');
function foo_add_rewrite_rule(){
    add_rewrite_rule('^foobar?','index.php?is_foobar_page=1&post_type=custom_post_type','top');
    //Customize this query string - keep is_foobar_page=1 intact
}

add_action('query_vars','foo_set_query_var');
function foo_set_query_var($vars) {
    array_Push($vars, 'is_foobar_page');
    return $vars;
}

add_filter('template_include', 'foo_include_template', 1000, 1);
function foo_include_template($template){
    if(get_query_var('is_foobar_page')){
        $new_template = WP_CONTENT_DIR.'/themes/your-theme/template-name.php';
        if(file_exists($new_template))
            $template = $new_template;
    }
    return $template;
}

cela fonctionne parfaitement dans le thème enfant actif, mais lorsque je le déplace dans le plug-in, il échoue.

j'utilise flush_rewrite_rules (); dans le plugin et ont désactivé/activé pour vider les règles de réécriture.

J'ai défini les constantes à extraire du répertoire du plugin dans la fonction templae.

Est-ce que quelqu'un peut me dire ce qu'il me manque?

1
phlipinmi

Lorsqu'un plugin est activé, le hook d'activation est le seul code qui s'exécute sur cette requête. Si vous supprimez les règles de réécriture lors de l'activation, votre règle ne figure pas dans le tableau de règles à partir duquel tout est reconstruit, sauf si vous l'ajoutez explicitement en premier dans le crochet d'activation.

register_activation_hook( __FILE__, 'myplugin_flush_rewrites' );
function myplugin_flush_rewrites() {
    // call your function that adds the rule here
    // (it should also be hooked into 'init')
    foo_add_rewrite_rule();
    flush_rewrite_rules();
}

Votre règle doit toujours être ajoutée sur init à chaque demande, car un autre code, ou le chargement d'une page de paramètres de permalien, peut vider les règles de toute demande.

1
Milo