after_setup_theme wird immer ausgeführt

11

Ich richte für einige meiner Fakultätsmitglieder ein untergeordnetes Thema ein. Als Teil des Themas möchte ich, dass eine Handvoll Plugins zum Zeitpunkt der Aktivierung des Themas aktiviert werden. Also habe ich natürlich die Aktion after_setup_theme verwendet und meine Setup-Funktion aufgerufen. Es funktioniert großartig, außer es läuft auf JEDER Anfrage (admin und sonst). Ich habe dies bewiesen, indem ich dies am Ende der Setup-Funktion hinzugefügt habe:

echo '<script type="text/javascript">alert("This action was run")</script>';

Als Ergebnis erhalten Sie eine Javascript-Warnung für jede Administratoranforderung und jede Front-End-Anforderung (ich habe ein Netzwerk-Setup, daher wird die Funktion auf Websites, auf denen dieses Thema nicht aktiv ist, offensichtlich nicht ausgeführt).

Die Frage ist also, ist das ein Fehler? Mache ich irgendwie etwas falsch Hier ist der vollständige Code, den ich verwende:

add_action( 'after_setup_theme', 'fwp_setup' );
function fwp_setup(){
    // -- Unrelated code remove for the sake of brevity 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
    echo '<script type="text/javascript">alert("This action was run")</script>';
}

Jeder Einblick wäre sehr dankbar!

Aaron Wagner
quelle
LÖSUNG: after_switch_thememacht genau das, was ich hier beabsichtigt habe. Es wird ausgelöst, nachdem das Thema auf Ihr Thema umgestellt wurde. Eine der unten genannten Lösungen verwendet switch_theme. Dies führt nicht zu den gewünschten Ergebnissen, da dies nur beim Wechseln von Ihrem Thema geschieht. Verweisen Sie auf diesen Trac Kommentar
Aaron Wagner
Bitte posten Sie dies als Antwort und nicht als Kommentar zu Ihrer Frage. :)
Chip Bennett
2
Entschuldigung. Das würde ich noch nicht tun lassen. Ich werde es gleich als Antwort hinzufügen.
Aaron Wagner

Antworten:

8

LÖSUNG: after_switch_thememacht genau das, was ich hier beabsichtigt habe. Es wird ausgelöst, nachdem das Thema auf Ihr Thema umgestellt wurde. Eine der unten genannten Lösungen verwendet switch_theme. Dies führt nicht zu den gewünschten Ergebnissen, da dies nur beim Wechseln von Ihrem Thema geschieht.

Hier ist ein Artikel, den ich als Referenz gefunden habe: http://core.trac.wordpress.org/ticket/7795#comment:29

Hier ist mein geänderter Code

add_action( 'after_switch_theme', 'fwp_theme_setup' );
function fwp_theme_setup(){ 
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-admin/includes/plugin.php');
    activate_plugin('enable-media-replace/enable-media-replace.php');
    activate_plugin('seo-image/seo-friendly-images.php');
    activate_plugin('w3-total-cache/w3-total-cache.php');
}
Aaron Wagner
quelle
5

Die after_setup_themeAktion soll bei jedem WordPress-Ladevorgang ausgelöst werden. Es ist einfach Teil des Prozesses, in dem WordPress das Vorlagensystem aufruft, die verschiedenen Setup-Parameter für das Theme ermittelt und anschließend weiterarbeitet, z. B. die richtige Vorlage für die Anzeige usw.

Mit anderen Worten, das after_setup_themerepräsentiert den Punkt, an dem WordPress das aktuelle Thema einrichtet, nicht den Punkt, an dem der Administrator das aktuelle Thema aktiviert und / oder konfiguriert .

Was Sie suchen, ist ein Theme- Aktivierungs- Hook, der derzeit aber nicht verfügbar ist geprüft / entwickelt wird .

Chip Bennett
quelle
Der Codex Eintrag Link irreführend ist schrecklich dann. Es heißt "Dieser Hook wird während einer Themeninitialisierung aufgerufen." Das bedeutet für mich, dass der Hook aufgerufen werden sollte, wenn er aktiviert ist. Ich verstehe aber, was du sagst. Schrecklich irreführend.
Aaron Wagner
5
init !== activation. Normalerweise nennt man __construct()Funktion in PHP auch eine initFunktion. Das heißt: Initialisieren Sie die Instanz.
Kaiser
Das Trac-Ticket ist 7 Jahre alt und scheint nicht repariert zu werden!
Numediaweb
4

Leider gibt es keinen Theme-Aktivierungs-Hook. Diese Frage bietet jedoch eine Lösung dafür.

Verwenden Sie einfach den 'Theme Activation Hook', um die Plug-Ins zu aktivieren.

Eine bessere Lösung ist diese . Beide verwenden im Wesentlichen dieswitch_theme Haken.


Gemäß den OP-Kommentaren und dem verknüpften Trac-Ticket - after_switch_themeist der Haken erforderlich.

Dies übergibt den Namen des alten Themas als Argument. Wenn dies jedoch in Ihrem ist functions.php(was es sein sollte ...), wird der Rückruf nur ausgelöst, wenn Ihr Thema aktiviert wird .

add_action( 'after_switch_theme', 'wpse50298_setup' );
function wpse50298_setup($theme_switching_from){
    // Your theme is being activated
}

In ähnlicher Weise wird das Hinzufügen eines Rückrufs zu switch_themenur aufgerufen, wenn Ihr Thema deaktiviert ist.

add_action( 'switch_theme', 'wpse50298_deactivate' );
function wpse50298_deactivate($theme_switching_to){
    // Your theme is being deactivated
}
Stephen Harris
quelle
Keine dieser Optionen hat bei mir funktioniert. switch_themefunktionierte erst nach Deaktivierung des Themas. Hat aber after_switch_themeperfekt funktioniert.
Aaron Wagner
1
aktualisierte Antwort :)
Stephen Harris
switch_theme scheint nicht mehr zu funktionieren. Ich denke, das liegt an den Änderungen in der 3.4-Aktivierung. Zumindest funktioniert es bei mir nicht.
Jake
after_switch_theme funktioniert perfekt. Dies sollte die akzeptierte Antwort sein. Ich benutze WP 3.5
Ardee Aram
0

Eine bessere Lösung könnte sein, zu verwenden das Plugin-Aktivierungsskript von Thomas Griffin . Dadurch werden Benutzer aufgefordert, Plugins Ihrer Wahl zu installieren, wenn das Thema verwendet wird. Ich denke, dies ist eine großartige Möglichkeit, das Plugin vom Thema zu trennen und es trotzdem zu nutzen.

Überprüfen Sie in Ihrem Thema, ob das Plugin aktiv ist, bevor Sie seine Funktionen verwenden. Dies ermöglicht den Benutzern mehr Auswahl und Kontrolle.

Sie können das Aktivierungsskript einfach mit Knapsack einrichten .

Jeff Sebring
quelle
3
Eine Antwort sollte mehr als nur ein Link zu einer externen Site sein . Bitte fügen Sie eine Lösung hinzu.
Fuxia
0

Ihre beste Lösung wäre jetzt, switch_themeHook zu verwenden und das übergebene Argument '$ theme' zu filtern, um zu sehen, ob es das aktuelle ist, und wenn nicht, zurückzukehren.

function nw_update_network($theme) {
   if ($theme !== 'my_theme_name') return;

   // Your code here
}

add_action('switch_theme', 'nw_update_network');
numediaweb
quelle