web-dev-qa-db-fra.com

La réécriture d'URL doit être activée manuellement pour mon plugin

Je crée un plugin Wordpress qui crée des pages (avec get_header(), get_footer() et get_sidebar()) pour la recherche via une API.

Bien sûr, j'ai défini certaines règles pour la réécriture d'URL comme ceci:

function init() {
    global $wp_rewrite;
    add_rewrite_rule('my_plugin/(.+)/results?', 'index.php?my_plugin=results&data=$matches[1]', 'top');
    ...
    $wp_rewrite->flush_rules();
}

Cette fonction est appelée avec cette ligne dans le constructeur de mon plugin:

add_action('init', array(&$this, 'init'));

Le plug-in fonctionne parfaitement, mais je dois activer manuellement la réécriture des URL dans Paramètres> Permaliens de mon tableau de bord d'administration. Il me suffit de sélectionner une option: Jour et nom , Mois et nom , Numérique ,... (peu importe).

Le problème est que, lorsque j’installe le plug-in sur un nouveau Wordpress avec des permaliens, désactiver ( par défaut ), je reçois toujours une erreur 404 . Cela ne fonctionnera que si j'active manuellement les liens permanents.
(Je sais que cela se fait par . Htaccess ).

Y at-il un moyen de contourner cela ou d'activer automatiquement Permalinks via mon plugin?
Une autre bonne solution est la bienvenue.

J'espère que ma question est claire.
Je vous remercie.

2
Florent Hemmi

Chaque fois que je crée un plug-in pour lequel des permaliens doivent être activés, je vérifie l'activation du plug-in et, si ce n'est pas le cas, j'affiche un message pour l'utilisateur:

// Add Check if permalinks are set on plugin activation
register_activation_hook( __FILE__, 'is_permalink_activate' );
function is_permalink_activate() {
    //add notice if user needs to enable permalinks
    if (! get_option('permalink_structure') )
        add_action('admin_notices', 'permalink_structure_admin_notice');
}

function permalink_structure_admin_notice(){
    echo '<div id="message" class="error"><p>Please Make sure to enable <a href="options-permalink.php">Permalinks</a>.</p></div>';
}
2
Bainternet

J'ai trouvé le code.

modify_permalinks('/%postname%/','','');
function modify_permalinks($permalink_structure, $category_base, $tag_base){
    global $wp_rewrite;

    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/misc.php');

    # get paths

    $home_path = get_home_path();
    $iis7_permalinks = iis7_supports_permalinks();

    # set the structure

    $permalink_structure = preg_replace('#/+#', '/', '/' . $permalink_structure);
    $wp_rewrite->set_permalink_structure($permalink_structure);

    $category_base = preg_replace('#/+#', '/', '/' . $category_base);
    $wp_rewrite->set_category_base($category_base);

    $tag_base = preg_replace('#/+#', '/', '/' . $tag_base);
    $wp_rewrite->set_tag_base($tag_base);

    # check if there is a file to rewrite

    if ( $iis7_permalinks ) {
        if ( ( ! file_exists($home_path . 'web.config') && win_is_writable($home_path) ) || win_is_writable($home_path . 'web.config') )
            $writable = true;
        else
            $writable = false;
    } else {
        if ( ( ! file_exists($home_path . '.htaccess') && is_writable($home_path) ) || is_writable($home_path . '.htaccess') )
            $writable = true;
        else
            $writable = false;
    }

    # flush the rules

    update_option('rewrite_rules', FALSE);
    $wp_rewrite->flush_rules($writable);
}
0
0_0