it-swarm.com.de

Richtige Verwendung von Funktionen in Action Hook?

Ich frage mich, ob die folgende Logik korrekt ist und ob bestimmte Umstände vorliegen sollten, damit sie funktioniert, da sie in einigen Fällen nicht funktioniert.

Das folgende Beispiel ist recht einfach. Angenommen, ich möchte eine Funktion verwenden, die an einer anderen Stelle in einer themenbezogenen Datei definiert ist, beispielsweise parent_theme_hooks.php, und zwar über einen Aktionshook in meinem untergeordneten Thema functions.php.

parent_theme_hooks.php

function is_enabled(){
    return true;
}

function check_if_enabled(){    
    do_action( 'my_hook', $some, $args );
}

Dann im child-theme functions.php

function my_function($some, $args) {
    if ( is_enabled() ) {
        $message = 'yes';
    } else {
        $message = 'no';
    } 
    echo $message;
}
add_action( 'my_hook', 'my_function', 11, 2 );

Frage Meine Frage ist also, ob ich die Funktion is_enabled() im untergeordneten Thema functions.php verwenden kann, wenn sie an anderer Stelle im übergeordneten Thema definiert ist?

Vielen Dank

1
RobbTe

Ja, du kannst. Aber Sie müssen vorsichtig sein, da einige Sonderfälle auftreten können. Einige von ihnen sind:

1. Funktion kann eine Klassenmethode und keine globale Funktion sein:

class SomeClass {
   ...
   function some_function() { ... }
   ...
}

In diesem Fall können Sie es nur verwenden, wenn: - es sich um eine statische Funktion handelt - es sich um eine öffentliche Methode handelt und Sie Zugriff auf ein Objekt dieser Klasse haben.

2. Dateien mit dieser Funktion können nicht immer enthalten sein:

function do_something() {
    if ( condition_met() ) {
        include_once( 'parent_theme_hooks.php' );
    }
}

In diesem Fall sind die Funktionen dieser Datei nicht immer verfügbar.

3. Die Funktion kann in der if-Anweisung deklariert werden:

if ( class_exists( 'SomeClass' ) ) {
    function some_function() { ... }
}

Auch hier gilt: Wenn eine bestimmte Klasse nicht vorhanden ist, kann auf die Funktion nicht zugegriffen werden.

4. Datei ist noch nicht geladen

Wenn die Funktion mit einem Plugin oder einem Theme geliefert wird, kann dies mit einem Aktions-Hook deklariert werden.

In diesem Fall ist die Funktion erst verfügbar, wenn dieser Haken ausgelöst wurde.

Ein weiteres Beispiel für diesen Fall ist die Verwendung von Funktionen aus dem übergeordneten Thema innerhalb des untergeordneten Themas. Die functions.php-Datei aus dem übergeordneten Design folgt der gleichen Datei aus dem untergeordneten Design. Daher können Sie übergeordnete Funktionen nicht direkt in der Datei functions.php für untergeordnete Themen verwenden.

Aber...

Es gibt einige Möglichkeiten, wie Sie Ihren Code zuverlässiger machen können, wenn Sie solche Funktionen verwenden:

  1. Versuchen Sie immer zu verstehen, wann und wie diese Funktion deklariert ist.
  2. Überprüfen Sie, ob die Funktion mit if ( function_exists( 'function_name' ) ) vorhanden ist, und rufen Sie sie nur auf, wenn dies der Fall ist. Sie können auch eine alternative Lösung (Fallback) bereitstellen, falls diese nicht vorhanden ist.
2

Sie können im übergeordneten Design definierte Funktionen verwenden, diese jedoch erst, nachdem das übergeordnete Design geladen wurde. Das übergeordnete Thema wird geladen nach Ihr untergeordnetes Thema.

Wenn Sie also eine Funktion aus dem übergeordneten Design verwenden möchten, können Sie dies nur innerhalb einer Funktion tun, die in einen Hook auf after_setup_theme oder später eingebunden ist.

Ihr Beispiel funktioniert also nur, wenn check_if_enabled() ausgeführt wird, nachdem das übergeordnete Thema geladen wurde. Wenn Sie versuchen, diese Funktion in Ihrem untergeordneten Design zu verwenden, bevor das übergeordnete Design geladen wurde, funktioniert dies nicht.

2
Jacob Peattie