web-dev-qa-db-fra.com

Problème uniquement lors de l'utilisation de require_once () dans functions.php

J'utilise add_theme_page() dans le functions.php de mon thème enfant qui implémente quelque chose comme ceci ...

// other functions located here that create a custom options page in the Dashboard.
// THIS IS NOT A FILE PATH ISSUE ->  THE CUSTOM PAGE IS CREATED IN BOTH CASES.

function my_menu() {
    ...
    if ( 'save' == $_REQUEST['action'] ) {
        echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">';
        die;
    }
    add_theme_page(...)
}

add_action('admin_menu', 'my_menu');

Selon les documents WordPress :

REMARQUE: Si vous rencontrez le "Vous ne disposez pas des autorisations suffisantes pour accéder à cette page." message dans un écran wp_die(), cela signifie que vous avez déjà raccroché trop tôt. Le hook que vous devriez utiliser est admin_menu.

C’est exactement l’erreur que j’obtiens tout de suite après avoir sauvegardé mes options. Cependant, j'ai utilisé le bon crochet comme recommandé.

Cette erreur ne survient que si je déplace ma fonction dans un nouveau fichier et utilise un require_once dans funtions.php. J'organisais mon code selon cette réponse .

require_once('includes/functions-theme-options.php');

Pourquoi cela se casse-t-il simplement en déplaçant la fonction dans un fichier externe? Je pensais que cela avait peut-être à voir avec le placement, mais la require_once() est exactement à la position où le code original a été placé.

  • Lorsque le code est à l'intérieur de functions.php, cela fonctionne bien.

  • Lorsque le code est déplacé dans un fichier externe et référencé avec require_once(), il se rompt ( les messages d'erreur lors de l'enregistrement, conformément à la documentation référencée ci-dessus ).

Évidemment, pour le moment, je le garde dans function.php, mais quelqu'un peut peut-être expliquer pourquoi il se brise quand je le déplace.


EDIT

Ce n'est pas un problème de chemin de fichier. Chaque fichier référencé par require_once() est trouvé et inclus. Le problème semble être la façon dont il est exécuté.

Veuillez lire cette réponse: https://wordpress.stackexchange.com/a/1406/11092


EDIT 2 - révisé le 16/01/13

Ceci est une version allégée qui a été vérifiée pour démontrer pleinement le problème. Ce code construit une page de sous-menu sous "Apparence" appelée "Options de thème". Lorsque vous cliquez sur le bouton "Enregistrer les options", la page est censée être rechargée et afficher un "paramètres de votre thème enregistrés" message. Cependant, à la place, il affiche la page d'erreur WordPress, "Vous ne disposez pas des autorisations suffisantes pour accéder à cette page." Le simple déplacement de la dernière fonction dans functions.php efface ce problème d'autorisations. Je voudrais savoir pourquoi et comment je peux résoudre ce problème.

dans le fichier functions.php:

<?php

require_once('includes/functions-test.php');

dans mon répertoire enfant-thème, le fichier includes/functions-test.php:

<?php

$themename = wp_get_theme();

function mytheme_admin() {

    global $themename;

    if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings saved.</strong></p></div>';

    ?>

    <div class="wrap">
        <h2><?php echo $themename; ?> Options</h2>
        <div style="border-bottom: 1px dotted #000; padding-bottom: 10px; margin: 10px;">Options specfic to this theme.</div>
        <form method="post">
            <p class="submit">
                <input name="save" type="submit" class="button button-primary" value="Save Options" />    
                <input type="hidden" name="action" value="save" />
            </p>
        </form>
    </div>

<?php               
}


function wp_initialize_the_theme_load() {
    if (!function_exists("wp_initialize_the_theme")) { 
        wp_initialize_the_theme_message();
        die;
    }
}

add_action('admin_menu', 'mytheme_add_admin');


/*  move only the following function to 'functions.php' and the problem is gone
__________________________________________________________________________*/ 

function mytheme_add_admin() {
    global $themename, $shortname;  
    if ( $_GET['page'] == basename(__FILE__) ) {    
        if ( 'save' == $_REQUEST['action'] ) {
            echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">';
            die;
        } 
    }
    add_theme_page($themename." Options", "Theme Options", 'edit_theme_options', basename(__FILE__), 'mytheme_admin');
}
1
Sparky

J'ai remarqué que l'URL de la page de tableau de bord personnalisée est la suivante ...

themes.php?page=functions-test.php

Remarquez comment page est le nom de mes fonctions externes dans includes/functions-test.php.

Le problème est dans cette ligne, celle qui rafraîchit la page juste avant l'erreur d'autorisation ...

echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">';

Maintenant, cela semble tellement évident. Examinez le paramètre page dans l'URL ... c'est functions.php où il devrait s'agir du nom de mon fichier inclus, functions-test.php.

C'est le correctif ...

echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions-test.php&saved=true">';

Maintenant, je me demande s'il existe une solution plus robuste qu'un nom de fichier codé en dur.

EDIT:

Et sans un nom de fichier codé en dur ... en d'autres termes, en utilisant basename(__FILE__) à la place, j'aurais pu déplacer ce code n'importe où sans le mal de tête.

echo '<meta http-equiv="refresh" content="0;url=themes.php?page=' . basename(__FILE__) . '&saved=true">';

Merci aux suggestions de dépannage de @ChipBennett.

EDIT 2:

En allant un peu plus loin, j'ai pu supprimer complètement les metarefresh; et die;, où à la place j'utilise la action de l'élément form comme prévu. Il s’agit du même formulaire action que celui utilisé dans les pages d’apparence WordPress par défaut.

<form action="<?php echo esc_url( add_query_arg( 'saved', true ) ) ?>" method="post">

add_query_arg( 'saved', true ) signifie que lorsque la page redirige vers elle-même, lors de la soumission du formulaire, &saved=1 est ajouté à sa chaîne de requête. C’est la seule partie dont ce code a besoin pour afficher le message "options saved". Le très négligé meta refresh; die avec son URL codée en dur , la racine du problème initial, a été complètement éradiqué.

FYI:Ceci est un projet dans lequel je dois extraire les options et les fonctionnalités originales du client de leur thème "personnalisé" et les déplacer dans un thème enfant de Twenty Thirteen. Le thème brisé original qui utilise ces pratiques de codage bâclées est appelé Délicat .

1
Sparky