Warum nicht Shortcodes registrieren, wenn is_admin Dashboard?

10

Ich habe festgestellt, dass einige Plugins wie Contact-form-7 , Nextgen-gallery , möglicherweise andere, eine interessante Anti-Funktion haben , ihre Shortcodes nicht zu registrieren, wenn dies is_admin()wahr ist.

Das Problem ist, wenn Sie einen dynamischen Inhalt (der möglicherweise einen Shortcode enthält) aus Ajax generieren und die "richtige" wp-Methode admin-ajax.php verwenden möchten, ist es unmöglich, dass WP_ADMIN nicht wahr ist. Siehe die ersten Zeilen von admin-ajax.php:

define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
    define( 'WP_ADMIN', true );
}

Nun scheint es PHP-Erweiterungen zu geben, mit denen Sie eine definierte Konstante (hacky) aufheben können, oder es gibt eine Möglichkeit, mit dem undokumentierten WP_Screen-System herumzuspielen und $GLOBALS['current_screen']die is_admin()Funktion false zurückzugeben? Die am besten verwendbare Problemumgehung scheint das Posten auf der Seite oder im Site-Stammverzeichnis zu sein.

Ist es üblich, dass Plugins ihre Shortcodes registrieren, wenn sie is_admin()falsch sind? Wenn ja, konnte ich keine andere Dokumentation oder einen anderen Grund dafür finden, als dass es sich möglicherweise um eine vorzeitige Optimierung handelt.

NoBugs
quelle

Antworten:

6

Ich habe vor einiger Zeit das gleiche Problem mit Kontaktformular 7 beobachtet.

Aber beachten Sie, dass Shortcodes basierend auf Registrierung is_administ doing_it_wrong ( siehe gmazzap`s Antwort )

Es gibt zwei Gründe, die auf den ersten Blick legitim erscheinen (und warum sie falsch sind):

  1. (Unwahrscheinlich) Der Plugin-Autor hat versucht, das Skript so zu optimieren , dass Shortcodes nur dann registriert werden, wenn sie benötigt werden. In diesem Fall hat der Autor nicht berücksichtigt, dass der Shortcode in Ajax-Anforderungen verwendet werden könnte.

    Falsch, weil : Diese Optimierung bietet keinen Leistungsgewinn. Es fügt einfach einen Wert zum globalen Array "Registrierte Shortcodes" hinzu.

  2. (Dies ist wahrscheinlicher) Der Plugin-Autor hat die Unterstützung für den Shortcode in Ajax-Anfragen absichtlich deaktiviert . Bei Contact-Form-7 ist dies möglicherweise der Fall, da Formulare auf "Über Ajax senden" gesetzt werden können. Für diese Funktion muss das Formular jedoch zusätzliche Javascript-Dateien laden, die nicht geladen werden, wenn der Shortcode über Ajax analysiert und Javascript über hinzugefügt wird enqueue_scripts().

    Der Autor hat beschlossen, die Ajax-Unterstützung zu deaktivieren, um Fehlerberichte wie "Nicht verwenden: Formular wird angezeigt, aber das Klicken auf die Schaltfläche Senden funktioniert nicht. Vollständige Zeitverschwendung!" Zu verhindern.

    Der Benutzer sieht also entweder ein garantiertes oder gar kein Formular.

    Falsch, weil : Prüfen is_administ hier eine schlechte Praxis. Die Bedingung sollte prüfen, ob die Konstante DOING_AJAXdefiniert und wahr ist.

Obwohl die meisten Plugins diese Art von Bedingung nicht verwenden, haben die wenigen, die diese Einschränkung haben, diese möglicherweise aufgrund von Problemen in der Vergangenheit.

Wenn ein Shortcode einfach eine Ausgabe auf der Seite ausführt, gibt es keinen Grund, eine Administratorbedingung hinzuzufügen. Wenn der Shortcode jedoch auch JS- oder CSS-Dateien in die Warteschlange stellt, ist es sinnvoll, die Verwendung auf Nicht-Administrator- / Nicht-Ajax-Anforderungen zu beschränken.

Philipp
quelle
2
Das Nichtregistrieren von Shortcodes hat nahezu keine Auswirkungen auf die Leistung. Durch das Registrieren wird einem Array lediglich eine Variable hinzugefügt. Was möglicherweise langsam ist, ist, den Shortcode auszuführen, nicht ihn zu registrieren. Wenn es sich also um eine Leistungsoptimierung handelt, ist dies eine fehlerhafte. Wenn der Plugin Autor deaktivieren möchte Shortcode für Ajax, die Überprüfung für is_administ doing_it_wrong es ist viel bessere Möglichkeiten in WP für Ajax - Anfragen zu überprüfen. Wenn das Plugin js / css in die Warteschlange stellt, hat es 'wp_enqueue_scripts'keine Auswirkungen auf die Administrationsseiten , wenn es gut funktioniert (mithilfe von Aktion), da dieser Hook auf den Verwaltungsseiten nicht ausgelöst wird.
gmazzap
@gmazzap Danke für das Feedback, da stimme ich voll und ganz zu! Ich habe meine Antwort aktualisiert und Ihre Eingabe hinzugefügt, um klarer zu machen, dass die Bedingung eine schlechte Praxis ist.
Philipp
Ich denke nicht, dass # 2 wahrscheinlich ist, da enqueue_scripts the_contentAnrufe und Admin-Ajax-Anrufe nicht beeinflussen sollten .
NoBugs
3

Eigentlich gibt es keinen Grund, keine Shortcodes bei admin zu registrieren.

Wenn der Autor von Plugins das Plugin von Ajax deaktivieren möchte, sollte er dies tun

if (defined('DOING_AJAX') && DOING_AJAX)

anstatt nach admin zu suchen.

Beachten Sie, dass Shortcake in Zukunft möglicherweise in den Core eingebettet wird, da es sich um ein "Feature Plugin" handelt.

In diesem Fall funktioniert der im Administrator nicht definierte Shortcode nicht. Dies gibt Ihnen eine weitere Bestätigung, dass es keinen Grund gibt, keine Shortcodes bei admin zu registrieren: Selbst Kernentwickler arbeiten an Dingen, für die Shortcodes erforderlich sind, die bei admin verfügbar sind.

Das heißt, Sie haben Möglichkeiten:

  1. Wenden Sie sich an den Autor des Plugins und prüfen Sie, ob er dieses Verhalten beheben kann
  2. versuchen Sie selbst eine Lösung zu finden

In Bezug auf # 2 gibt es tatsächlich Bibliotheken, die erzwingen können is_admin, wahr zu sein. Durch sie sind hackish, und ich würde diese nie in der Produktion verwenden.

Ein Beispiel ist Patchwork .

Mit ihm können Sie jede benutzerdefinierte PHP-Funktion überschreiben.

In einem MU-Plugin können Sie Folgendes tun (völlig UNTESTED):

add_action('muplugins_loaded', function() {
  if ( defined('DOING_AJAX') && DOING_AJAX ) {
     require 'path/to/Patchwork.php';
     Patchwork\replace("is_admin", function() {
        return FALSE;
     });
  }
});

Dies macht die is_admin()Rückgabe bei Ajax-Anfragen falsch.

Wie gesagt, dies ist jedoch ziemlich hackisch und beeinflusst das Verhalten anderer Plugins (und des Kerns) mit unvorhersehbaren Effekten.

Sie können den Plugin-Shortcode-Handler auch für Administratoranfragen registrieren.

ZB wenn der Plugin Code lautet:

if (! is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

dann können Sie ein anderes Plugin schreiben, das Folgendes tut:

if (is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

Auf diese Weise wird in beiden Fällen der Shortcode hinzugefügt.

Dies kann je nach anderem Plugin-Code alleine funktionieren oder nicht, aber es gibt keine allgemeine Antwort darauf.

gmazzap
quelle
Sie können auch add_shortcode('shortcode', array('their-class', 'their-function') )oder ähnlich.
NoBugs
@nobugs natürlich :)
gmazzap
Oder eine bessere "Problemumgehung", posten Sie einfach im Stammverzeichnis der Site oder auf der Seite, was NextGen ironischerweise tut.
NoBugs