wake-up-neo.net

Deklarieren einer Instanz einer Klasse, die im übergeordneten Thema enthalten ist, aus der Datei functions.php für untergeordnete Themen

Bitte beachten Sie, dass dies alles "funktioniert" - die Frage ist über die beste Praxis und um zu versuchen und herauszufinden, warum ich die PHP -Datei einschließen muss, die die Klasse an zwei Stellen enthält, damit sie richtig funktioniert .

Ich arbeite an einem einfachen übergeordneten Thema, um meinen eigenen Entwicklungszyklus zu beschleunigen - und bin dabei, ein einfaches untergeordnetes Thema zu testen.

Ich verstehe, dass die functions.php-Datei für das Kind vor dem übergeordneten functions.php aufgerufen wird. Diese Datei enthält alle PHP -Funktionen und eine Klasse zum Hinzufügen von CPTs.

Ich möchte das CPT aus dem untergeordneten Thema erstellen - ich möchte, dass das übergeordnete Thema alle wiederverwendbaren und aktualisierbaren Funktionen enthält - aber nicht, dass in jeder WP -Installation, auf der es verwendet wird, hinzugefügte Funktionen vorab erstellt werden.

Zur Code-Frage:

Ich habe versucht, die Klasse (die sich in einer separaten PHP Datei befindet) in den untergeordneten functions.php aufzunehmen und dann eine Instanz zu instanziieren - zum Beispiel:

require_once TEMPLATEPATH."/library/cpt/cpt.php"; // CPT class ##
$cpt_tree = new Custom_Post_Type( "tree" ); // New CPT - "tree" ##

Beim erneuten Laden der Seite tritt ein Fehler auf:

Fatal error: Class 'Custom_Post_Type' not found in C:\xampp\htdocs\site\wordpress\wp-content\themes\child\functions.php on line 14

Also habe ich die gleiche PHP -Datei in die übergeordnete functions.php -Datei eingefügt - und alles funktioniert - als Experiment habe ich die Klasse aus dem untergeordneten Design entfernt - und es wird der gleiche Fehler ausgegeben.

Ich weiß, dass es bei dieser Frage an vielen Codebeispielen mangelt - ich hoffe, es wird bei jemandem eine Glocke läuten - oder jemand, der mehr über die Verwendung von Klassen versteht, wird mir einige Hinweise geben können - scheint dumm zu sein, diese Datei an zwei Stellen zu benötigen und Ich möchte die functions.php-Datei so sauber wie möglich halten.

5
Q Studio

Behandeln Sie alle Klassen, die in Ihrem übergeordneten Thema geladen werden, mit einer vorhersehbaren Aktion (Zeitpunkt) und schließen Sie später Ihr untergeordnetes Thema an.

Beispiel:

add_action( 'wp_loaded', 'parent_prefix_load_classes', 10 );

function parent_prefix_load_classes()
{
    $classes = [ 'Extra_Comment_Walker', 'Extra_Nav_Menu_Walker' ];

    foreach ( $classes as $class )
    {
        locate_template( "php/class.$class.php", TRUE, TRUE );
    }
}

Erstellen Sie Instanzen in Ihrem untergeordneten Design und stellen Sie sicher, dass Ihr Code ausgeführt wird, nachdem die Klassen geladen wurden:

// Priority 11 to run after the parent theme's loader.
add_action( 'wp_loaded', 'child_prefix_create_objects', 11 );

function child_prefix_create_objects()
{
    $nav_walker = new Extra_Nav_Menu_Walker;
}

Faustregeln:

  • Laden Sie niemals etwas, nur wenn die Datei (function.php) aufgerufen wird. Warten Sie auf wp_loaded.
  • Verwenden Sie das Prioritätsargument, um die Ausführungsreihenfolge zu steuern.

Einige Notizen:

  • Benutzerdefinierte Beitragstypen, Taxonomien und Shortcodes gehören zu Plugins. Sie sollten niemals Teil eines Themas sein, da dies zu einem Lock-In-Effekt für den Benutzer führen würde. Wenn ein Themenwechsel den Inhalt beschädigen würde, haben Sie etwas falsch gemacht.
  • Verwenden Sie require_once nicht in einem Thema. locate_template() ist flexibler. Sie können jetzt die gesamte Klasse in Ihrem untergeordneten Design überschreiben, wenn Sie dieselbe Verzeichnisstruktur verwenden.
5
fuxia