it-swarm.com.de

Problem nur bei Verwendung von require_once () in functions.php

Ich verwende add_theme_page() in dem functions.php meines Kinderthemas, der in etwa so implementiert ist ...

// 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');

Wie in den WordPress-Dokumenten :

HINWEIS: Wenn Sie auf die Meldung "Sie haben nicht genügend Berechtigungen, um auf diese Seite zuzugreifen." In einem wp_die()-Bildschirm stoßen, haben Sie sich zu früh angemeldet. Der Haken, den Sie verwenden sollten, ist admin_menu.

Dies ist genau der Fehler, den ich nach dem Speichern meiner Optionen erhalte. Ich habe jedoch den richtigen Haken wie empfohlen verwendet.

Dieser Fehler tritt nur auf, wenn ich meine Funktion in eine neue Datei verschiebe und einen require_once innerhalb von funtions.php verwende. Ich organisierte meinen Code gemäß dieser Antwort .

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

Warum bricht dies einfach ab, indem die Funktion in eine externe Datei verschoben wird? Ich dachte, dass es vielleicht mit Platzierung zu tun hat, aber die require_once() befindet sich genau an der Position, an der der ursprüngliche Code platziert wurde.

  • Wenn der Code in functions.php enthalten ist, funktioniert er einwandfrei.

  • Wenn der Code in eine externe Datei verschoben und mit require_once() referenziert wird, bricht er ab (Fehlermeldungen beim Speichern gemäß den oben angegebenen Dokumenten).

Natürlich behalte ich es vorerst im function.php, aber vielleicht kann jemand erklären, warum es kaputt geht, wenn ich es verschiebe.


EDIT

Dies ist kein Dateipfadproblem . Jede Datei, auf die require_once() verweist, wird gefunden und eingeschlossen. Das Problem scheint zu sein, wie es ausgeführt wird.

Bitte lesen Sie diese Antwort: https://wordpress.stackexchange.com/a/1406/11092


EDIT 2 - überarbeitet am 16.01.13

Dies ist eine abgespeckte Version, die überprüft wurde, um das Problem vollständig zu demonstrieren. Dieser Code erstellt eine Untermenüseite unter "Darstellung" mit dem Namen "Designoptionen". Wenn Sie auf die Schaltfläche "Optionen speichern" klicken, soll die Seite neu geladen werden und die Meldung "Ihre Designeinstellungen wurden gespeichert" angezeigt werden. Stattdessen wird jedoch die WordPress-Fehlerseite "Sie haben nicht genügend Berechtigungen, um auf diese Seite zuzugreifen." Angezeigt. Durch einfaches Verschieben der letzten Funktion in functions.php wird dieses Berechtigungsproblem behoben. Ich würde gerne wissen, warum und wie ich das beheben kann.

in der functions.php Datei:

<?php

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

in meinem Child-Theme-Verzeichnis includes/functions-test.php file:

<?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

Mir ist aufgefallen, dass die URL der benutzerdefinierten Dashboard-Seite ...

themes.php?page=functions-test.php

Beachten Sie, wie die page der Name meiner externen Funktionen in includes/functions-test.php ist.

Das Problem liegt in dieser Zeile, die die Seite kurz vor dem Berechtigungsfehler aktualisiert ...

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

Jetzt scheint es so offensichtlich. Sehen Sie sich den Parameter page in der URL an ... es ist functions.php, wobei es sich um den Namen meiner Includes-Datei functions-test.php handeln sollte.

Das ist die Lösung ...

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

Jetzt frage ich mich, ob es eine robustere Lösung gibt als einen fest codierten Dateinamen.

BEARBEITEN:

Und ohne einen fest codierten Dateinamen ... mit anderen Worten, wenn Sie stattdessen basename(__FILE__) verwenden, hätte ich diesen Code ohne Kopfschmerzen überall hin verschieben können.

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

Vielen Dank an @ChipBennett für die Fehlerbehebung.

EDIT 2:

Ich ging noch einen Schritt weiter und konnte die metarefresh; und die; vollständig entfernen, wobei ich stattdessen die action des form -Elements so verwende, wie es beabsichtigt war. Dies ist die gleiche Form action wie auf den Standard-WordPress-Darstellungsseiten.

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

add_query_arg( 'saved', true ) bedeutet, dass beim Zurückleiten der Seite zu sich selbst beim Absenden des Formulars &saved=1 an die Abfragezeichenfolge angehängt wird. Dies ist der einzige Teil, den dieser Code benötigt, um die Nachricht "options saved" anzuzeigen. Der sehr schlampige meta refresh; diemit seiner fest codierten URL, die Wurzel des ursprünglichen Problems, wurde vollständig beseitigt.

FYI: Dies ist ein Projekt, in dem ich die ursprünglichen Optionen und Funktionen des Kunden aus seinem "benutzerdefinierten" Thema extrahieren und sie in ein untergeordnetes Thema von 13/21 verschieben muss. Das ursprünglich defekte Thema, das diese schlampigen Codierungsmethoden verwendet, heißt Delicate .

1
Sparky