Verwenden von register_activation_hook in classn

Ich versuche, ein Plugin für grundlegende SEO-Zwecke zu entwickeln, da viele Leute, die ich kenne, Joost nicht gerne benutzen. Ich habe das Plugin buchstäblich gestartet und baue die Aktivierungsmeldung aus, die dem Benutzer angezeigt wird, wenn er das Plugin aktiviert. Ich habe Probleme mit einer Mischung aus OOP und integrierten WordPress-functionen und bin mir nicht sicher, wo ich falsch liege.

Die einzige Möglichkeit, dies zu erreichen, besteht darin, eine neue Instanz der SEO_Plugin_Activation- class in meinem Hauptdateikonstruktor zu erstellen und dann die activatePlugin-Methode in dieser class aufzurufen. Ich denke, das ist unnötig. Ich denke auch nicht, wie ich meine functionen in der Aktivierungsklasse ausführe. Aber es ist der einzige Weg, wie ich es jetzt zur Arbeit bringen kann.

Ich bin mir nicht sicher, ob das, was ich tue, ist, weil ich OOP-Techniken nicht zu 100% verstehe oder wenn ich WordPress-API nicht richtig verwende. Ich habe drei Codebeispiele in der folgenden Reihenfolge eingefügt:

  1. Haupt-Plugin-Datei
  2. classndatei, die meine Aktivierungsanforderungen behandelt
  3. Was ich wirklich gehofft hatte, konnte getan werden.

seo.php (Hauptplugin-Datei)

activatePlugin(); } } new SEO(); ?> 

class-Plugin-Aktivierung.php

 <?php class SEO_Plugin_Activation { function __construct() { register_activation_hook(__FILE__ . '../seo.php', array($this, 'activatePlugin')); add_action('admin_notices', array($this, 'showSitemapInfo')); } function activatePlugin() { set_transient('show_sitemap_info', true, 5); } function showSitemapInfo() { if(get_transient('show_sitemap_info')) { echo '
' . 'Your sitemap files can be found at these following links: ' . '
'; delete_transient('show_sitemap_info'); } } } ?>

seo.php (Was ich mir erhofft habe)

  

Ich habe es so versucht, wie ich es im dritten Skript beschrieben habe, aber ich habe keinen Erfolg. Ab sofort wird die Nachricht korrekt angezeigt, ohne dass Fehlermeldungen angezeigt werden.

Solutions Collecting From Web of "Verwenden von register_activation_hook in classn"

Nachdem ich deine Frage erneut gelesen habe, denke ich, dass ich das Problem sehe, und es beruht auf einem Missverständnis darüber, wie register_activation_hook funktioniert, kombiniert mit einiger Verwirrung darüber, wie du deinen Code bootstrappst und was es bedeutet, zu bootstrappen

Teil 1: register_activation_hook

Diese function benötigt 2 Parameter:

register_activation_hook (String $ Datei, aufrufbare $ function)

Der erste Parameter, $file ist die Haupt-Plugin-Datei, nicht die Datei, die das enthält, was Sie ausführen möchten. Es wird genauso verwendet wie plugins_url , also benötigen Sie den Wert von __FILE__ , genauer gesagt dessen Wert in der Root-Plugin-Datei mit Ihrem Plugin-Header.

Der zweite Parameter ist aufrufbar und funktioniert wie erwartet, aber er verwendet intern nur add_action

Wenn ein Plugin aktiviert ist, wird die Aktion ‘activate_PLUGINNAME’ aufgerufen. Im Namen dieses Hooks wird PLUGINNAME durch den Namen des Plugins einschließlich des optionalen Unterverzeichnisses ersetzt. Wenn sich das Plugin zum Beispiel in wp-content / plugins / sampleplugin / sample.php befindet, wird der Name dieses Hooks zu ‘activate_sampleplugin / sample.php’.

Teil 2: Bootstrapping und __FILE__

Ein grundlegendes Problem ist, dass __FILE__ an verschiedenen Stellen unterschiedliche Werte hat und Sie einen bestimmten Wert benötigen.

Sie haben auch ein Problem, dass Bootstrapping das Objektdiagramm zusammenstellen sollte, aber Sie tun das nicht. Alle Ihre Objekte werden erstellt, sobald sie definiert oder ineinander erstellt werden, sodass es schwierig oder unmöglich ist, Werte an sie zu übergeben.

Als Beispiel könnte ich ein solches Plugin schreiben:

plugin.php :

 < ?php /** * Plugin Name: My Plugin * Version: 0.1 */ // loading step require_once( 'php/app.php' ); // bootstrapping step $app = new App( __FILE__ ); // execution step $app->run(); 

Ich habe alle meine classn im php Unterordner definiert und alle am gleichen Ort geladen. PHP weiß jetzt, was meine classn sind, ihre Namen usw., aber es ist noch nichts passiert.

Ich erstelle dann alle meine Objekte und übergebe ihnen, was sie brauchen, in diesem Fall benötigt App den Wert von __FILE__ also __FILE__ ich es weiter. Beachten Sie, dass dies die Objekte im Speicher erstellt, aber nicht funktioniert. Die Plugins-Anwendung ist bereit zu gehen, um in Aktion zu gehen, aber es ist in der Vorbereitungsphase.

Der nächste Schritt könnte sein, diese Objekte in eine Reihe von Komponententests zu pipen, aber jetzt werde ich sie ausführen. Ich habe meinen Bootstrapping-process beendet und die Anwendung kann jetzt ausgeführt werden. Daher trigger ich die run Methode. Ich sollte nichts weiterleiten müssen, da alles Notwendige an die Konstrukteure weitergegeben wurde. Während der run Methode füge ich alle meine Filter und Hooks hinzu. Während dieser Hooks laufen alle anderen Teile des Plugins.

Der wichtige Teil ist jedoch, dass ich eine definierte Struktur habe und dass ich während der Konstruktions- / Bootstrapping-Phase mit einem definierten Lebenszyklus das Notwendige übergebe

Sie müssen wirklich Ihre Aktivierung / Deaktivierung / Deinstallieren Hooks außerhalb Ihrer Plugin-class nach Kaisers Antwort hier registrieren, die eine viel bessere Übersicht über das Thema als ich schreiben könnte.

Das sollte Sie abdecken, wenn Sie dieses Plugin als Lernübung schreiben möchten. Wenn alles, was Sie suchen, ein SEO-Plugin ist, das gut funktioniert und nicht mit klebrigen Anzeigen wie Yoast verputzt ist, kann ich Ihnen das SEO Framework wärmstens empfehlen.

Tom McFarlin hat ein sehr umfangreiches Plugin erstellt (jetzt von Devin Vinson gepflegt), alles in OOP geschrieben, mit dem Sie entweder Ihr neues Plugin erstellen oder einfach den Anwendungsfluss studieren können, um Ihre Frage zu beantworten. Ich habe es für mehrere benutzerdefinierte Plugins verwendet, und ich muss sagen, es öffnete mir wirklich die Augen für einige der Geheimnisse von OOP.