it-swarm.com.de

Wie macht man ein Plugin in einem wp Theme erforderlich, ohne PHP-bedingte Anweisungen zu verwenden, wenn man eine einzelne Funktion von diesem Plugin aus aufruft?

Für eines meiner Wordpress-Designs sind einige Plugins von Drittanbietern erforderlich, um ordnungsgemäß zu funktionieren.

Meistens habe ich Funktionen aus Plugins von Drittanbietern mit bedingten Anweisungen wie aufgerufen

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

angenommen, ich muss in vielen Dateien meines Themas ausgiebig ein Plugin verwenden. Ich möchte die Verwendung vieler IF-Bedingungen vermeiden. Gibt es eine geeignete Möglichkeit, die Installation eines bestimmten Plugins in WPzu erfordern? _ oder noch besser installieren, wenn sie fehlen, bevor Sie das Thema aktivieren?

vielen Dank

8
unfulvio

is_plugin_active() ist ziemlich zerbrechlich: Es bricht ab, wenn der Plugin-Autor die Hauptdatei umbenennt oder wenn der Benutzer das Verzeichnis oder die Hauptdatei des Plugins umbenennt. Es ist besser zu überprüfen, ob eine bestimmte öffentliche Funktion existiert.

Um zu vermeiden, dass Sie diese Prüfung jedes Mal durchführen müssen, wenn Sie einige Funktionen des Plugins benötigen, können Sie im Administratorbereich eine Meldung anzeigen:

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

Eine andere Alternative ist die Verwendung von http://tgmpluginactivation.com/

6
scribu

Während dies nicht verhindern würde, dass das Theme bei deaktiviertem Plugin kaputt geht, würde ich mir diesen Artikel über "So zeigen Sie einen Admin-Hinweis für erforderliche Themes an" Plugin ansehen. Ich war noch nie mit der Idee eines Themas Forcen vertraut, das installiert werden soll, und daher scheint dies die nächstbeste Option zu sein.

Noch ein kurzer Gedanke: Ich habe das noch nie versucht, aber ich frage mich, ob Sie eine clevere Möglichkeit finden könnten, mehrere Hooks in einer einzigen Bedingung unterzubringen. Möglicherweise können Sie alle bedingten Funktionen in einer anderen Datei trennen und nur dann anfordern, wenn if( function_exists( 'plugin_function' ) )true zurückgibt (mit dem Verständnis, dass dies eine unvollständige Prüfung ist.

1
mrwweb

Hinweis:Diese Antwort dient nur dazu, die Diskussion zwischen @scribu und @kaiser zu vereinfachen. Mods: Bitte nicht löschen. Benutzer/Leser: Bitte nicht abstimmen Wenn Sie der Diskussion folgen möchten, schauen Sie sich das Revisions-/Bearbeitungsprotokoll an. Wenn Sie an der Diskussion teilnehmen möchten, bearbeiten Sie die Antwort. Wenn die Diskussion ein Ergebnis hat, wird sie als solche markiert. Vielen Dank.


Szenarien

Es gibt auch verschiedene Szenarien, die unterschiedlich gewichtet sind und von denen Sie möglicherweise eine Plug-in-Abhängigkeit haben. (Die Beispiele sind nur fiktiv). Das Word "(parent) Plugin" kann aus übergeordneter Sicht mit "Theme" ausgetauscht werden.

  1. (schwer) Ein untergeordnetes Plugin, das nur die Funktionalität erweitert oder die Anzeige (und ähnliches) eines vorhandenen Plugins ändert und daher nicht ohne das übergeordnete Plugin existieren kann. Beispiel: BuddyPress "BuddyPress-FunkyCommentDisplay
  2. (normal) Ein Plugin mit erweiterter Funktionalität, wenn ein untergeordnetes Plugin aktiviert wird. Beispiel: jQueryAttachmentCarousel "jQuerySlideDeck
  3. (soft) Ein Plugin, das nur eine Funktion hinzufügt. Beispiel: DisneyWonderlandTheme "MickeysSocialLinks

Im Folgenden versuche ich zu skizzieren, was passiert, wenn Sie das "andere" Plugin aktualisieren und die Überprüfung nicht mehr funktioniert.

  • Ad 1) Das Plugin könnte ohne BuddyPress nicht existieren. "Der Inhalt ist komplett kaputt.
  • Zu 2) Das Plugin konnte nicht die Möglichkeit bieten, von Karussell zu SlideDeck zu wechseln. "Displays verkabelt (ich gehe davon aus, dass die Stile zu SlideDeck geändert wurden).
  • Ad 3) MickeysSocialLinks verschwinden.

Prüfen

Es gibt imho drei Möglichkeiten zu prüfen, ob ein Plugin aktiv ist:

  • A. Existiert der Ordner?
  • B. Existiert die Hauptdatei - Option 'active_plugins' -?
  • C. Existiert eine bestimmte Funktion?

Wenn ich jetzt mein Internal Link Checker Plugin als Beispiel nehme, das keine öffentliche API bietet und nicht erweitert werden soll, dann sehe ich keinen Grund (als Autor), die interne Funktionsbezeichnung bei Bedarf nicht zu ändern oder einfach so. Wenn also jemand versuchen würde, dieses Plugin zu huckepack zu verwenden, würde beim Update einfach etwas kaputt gehen (abhängig von der Funktionalität und der Bündelung). Gleiches gilt für Dateinamen. Ich hätte keinen wirklichen Grund (abgesehen davon, dass das Plugin beim Update deaktiviert würde), den Dateinamen nicht zu ändern. Das einzige, was mich daran hindern würde, den Ordnernamen zu ändern, ist, dass die Überprüfung und Benachrichtigung des Updates anhand des Dateinamens ausgeführt wird - sofern dieser im offiziellen Repository gehostet wird.

Also würde ich von dem schwächsten (leicht zu ändern) zu dem härtesten (viel gegen das Ändern) Teil eines (Eltern-) Plugins sagen:

funktion "Hauptdateiname" Ordner


Als ich sagte, dass eine Funktionsprüfung weniger anfällig ist als die Verwendung von is_plugin_active(), ging ich davon aus, dass es sich um eine Funktion handelt, die der Autor des Plugins ausdrücklich empfiehlt. Das ultimative Beispiel hierfür ist das Template-Tag wp_pagenavi(), das vom WP-PageNavi-Plugin angeboten wird.

Die Schwierigkeit beim Definieren von Abhängigkeiten besteht darin, dass es keine Standardmethode gibt, um Plugins eindeutig zu identifizieren, die keine Dateinamen enthalten.

Weitere Gedanken zum Thema:

http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namidentifying-scheme


Ich denke, wir können es bisher in drei Punkten zusammenfassen:

  • Wir haben über etwas andere Themen gesprochen
  • Wir sind uns einig, dass es keinen kugelsicheren Weg gibt, um das zu umgehen, was ich mir vorgestellt habe
  • Nach Ihrem Verständnis der Frage haben Sie den richtigen Weg vorgeschlagen

Der (bisher) klügste Weg, den ich mir vorstellen kann, den ich bereits in einigen (viel zu wenigen) Plugins gesehen habe:

// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );

Ohne zu sehr darüber nachzudenken, aber ich vermute, Sie könnten Ihre Benachrichtigung in einen Check-on-All-Filter einbinden und im aktuellen Filter prüfen, ob sie ausgelöst wurde, als Sie sich auf dem shutdown-Hook befanden ...?


Die Verwendung von Hooks eignet sich gut für "normale" und "schwache" Abhängigkeiten. Der einzige Nachteil ist, dass Sie immer noch function_exists() oder is_plugin_active() verwenden müssen, wenn Sie aufhören möchten, wenn die Abhängigkeit nicht erfüllt ist. Die Verwendung des "All" -Filters dafür wäre IMO zu teuer.

@scibu Dies war auf "Ihr" Thema ausgerichtet. (Ich habe schon aufgehört, über meine zu reden). :)

Wenn Sie also eine Abhängigkeit benötigen - und Sie haben einen netten Autor -, könnte er stattdessen/als Ersatz für ein Template-Tag einen Hook anbieten. Denn das Plugin würde sich nur einhängen, wenn der Haken vorhanden wäre, oder einfach nichts tun. Und auf der anderen Seite hätten Sie keinen Fehler, wenn die Plugins nicht vorhanden wären.

Hier ist der schwierige Teil (oder mehr eines Q): Um einen Administrator-Hinweis zu verfassen, um den Benutzer über die Abhängigkeit "Sie müssen" DisneyWonderLinks "installieren" zu informieren, können Sie die array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] ) überprüfen. Ich bin mir nicht sicher, ob dies funktionieren würde, aber afaik sollte das Array auf beiden (public/admin) Seiten zugänglich sein.


Das würde nicht funktionieren. Nur weil ein Rückruf für einen Hook registriert ist, bedeutet dies nicht, dass der Hook erwartungsgemäß ausgelöst wird. Das einzige, was irgendwie funktionieren würde, ist die Verwendung des 'Shutdown'-Hakens, den Sie zuvor erwähnt haben:

add_action( 'shutdown', function() {
  if ( !did_action( 'template_tag_like_hook' ) )
    echo 'Problem.';
} );

Dies wird natürlich ganz unten nach dem Tag </html> im Front-End gedruckt (da hier normalerweise Vorlagen-Tags verwendet werden), was nicht sehr hilfreich ist.

Sie könnten versuchen, die Nachricht in wp_options zu speichern und sie dann im Admin-Bereich anzuzeigen, aber das würde eine ganz neue Dose Würmer öffnen: Ungültigkeit, Caching-Plugins usw.

0
kaiser

Wenn Sie nur eine Pluginseite benötigen, gibt es is_plugin_active() . Wenn Sie es außerhalb benötigen, kopieren Sie die Kernfunktion besser in Ihr Thema und verwenden Sie sie dann erneut:

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

Die Bedingung vermeidet Fehler durch doppeltes Definieren der Funktion.

0
kaiser