Wie verwerfe ich eine in einem Plugin verwendete Funktion?

17

Eine der Funktionen, die ich bin in meiner Plugin ist die Verschmutzung des globalen Bereichs mit einem Namen, der mit einer anderen Funktion (verwendete in einem anderen Plugin) kollidieren könnte. Ich denke, ich sollte es ablehnen. Aber wie soll ich das?

function foo() {
    echo 'bar';
}

Ich bin mir dessen bewusst , _deprecate_function()aber würde für ein Beispiel alle Schritte zeigt dankbar ich berücksichtigt werden , damit die Funktion von meinem Plugins Kern zu entfernen.

Ref: https://developer.wordpress.org/reference/functions/_deprecated_function/

henrywright
quelle
Frage gut, aber ist es vielleicht Zeit , um Ihre Plug - in - Namespace? Sie können immer noch den neuen Namensraum von Ihrer veralteten Funktion aufrufen ...
brianlmerritt
Namespacing ist eine Option , die ich aber nicht ganz entschieden , zu erkunden , ob ich Unterstützung fallen bin für PHP 5.2 vor.
Henrywright
Die veraltete Alternative Laden , wenn PHP - Version ist zu niedrig , aber sonst könnten Sie einen Namensräume ¨Ubergangspfad geben. Ihre veraltete Nachricht kann dann „Ihr Hosting - Provider unterstützt nicht PHP 5.3+ bla bla usw.“
brianlmerritt

Antworten:

11

Zusätzlich zur Antwort von @Welcher:

Es gibt einige guten „ Friedhof “ Beispiele im Kern, wo „ Funktionen kommen , um zu sterben “.

Man könnte sie als Richtlinien, zum Beispiel in Bezug auf die Dokumentation verwenden.

Hier ist ein solches Beispiel für die permalink_link()unter derwp-includes/deprecated.php

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
        _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );
        the_permalink();
}

Hier ist die Inline - Dokumentation für die _deprecated_functionFunktion , die die Eingabeargumente erklärt:

/**
 * Mark a function as deprecated and inform when it has been used.
 *
 * There is a hook deprecated_function_run that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated
 * function.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @access private
 *
 * @param string $function    The function that was called.
 * @param string $version     The version of WordPress that deprecated the function.
 * @param string $replacement Optional. The function that should have been called. 
 *                            Default null.
 */
birgire
quelle
1
Danke dafür. Ich habe nicht daran gedacht, die Herangehensweise von Core zu betrachten! Ich gehe also davon aus, dass dies die Schritte sind, die ich unternehmen muss? 1) entferne den gesamten ursprünglichen Inhalt aus meiner Funktion 2) füge einen Aufruf hinzu zu _deprecated_function()3) füge einen Aufruf zu meiner neuen Funktion hinzu, die den alten ersetzt
Henrywright 22.12.15
1
Dies klingt wie ein zweiseitiges Problem, das hier diskutiert wird - Veraltetheit und mögliche Namenskollisionen. Ich habe hier nur den ersten Teil gemäß dem Titel der Frage angesprochen.
Birgire
1
@ MarkKaplun Ich bin damit einverstanden, dass es zwei Probleme gibt. Die Frage war, wie man die Funktion ablehnt und darauf basierte meine Antwort. Der Hinweis __doing_it_wrong bezieht sich auf die Entwickler, die diese Methode in ihren Designs usw. aufrufen, damit sie auf die Änderungen in der API reagieren können, anstatt nur die Site zu überprüfen. Log Deprecated Notices ist ein großartiges Entwickler-Plugin, mit dem Sie über die wichtigsten Änderungen auf dem Laufenden bleiben und auch in diesem Fall Abhilfe schaffen können.
Welcher
1
@ MarkKaplun Ich verstehe deinen Standpunkt. Ich würde jedoch argumentieren, dass ein Teil der Abwertung darin besteht, die Abwärtskompatibilität aufrechtzuerhalten, bis das Element aus der API entfernt wird. Der Punkt der Bekanntmachung (unabhängig davon , welche Methode verwendet wird , um es zu erzeugen) ist Entwickler zu informieren , mit dem Verfahren , dass sie entfernt wird und ihnen Zeit , entsprechend zu handeln geben. Der Weg zum deprecate etwas ist es zu markieren und zu löschen, die richtige Art und Weise ist es, Benutzern bis zuerst ein Heads geben :)
Welcher
2
@ MarkKaplun Ich bin nicht sicher, wofür Sie argumentieren (oder?). Die Frage war, wie man eine Methode ablehnt und es ist klar, dass das OP sagt, dass "mein Plugin" weiß, was Ablehnung bedeutet, dass er ein Entwickler ist. Der imaginäre Benutzer, über den Sie sprechen, hat mit dieser speziellen Frage nichts zu tun. Wenn Sie befürchten, dass eine Million Meldungen im Protokoll angezeigt werden, werden die fraglichen Methoden nur ausgegeben, wenn WP_DEBUG aktiviert ist, und Ihrer Meinung nach würde dies von Nicht-Entwicklern und mit Sicherheit nicht in der Produktion aktiviert werden. Ich werde respektvoll nur zustimmen, einem Schritt nicht zuzustimmen :)
Welcher
7

Nicht immer bedeutet, dass das Element entfernt wird. In der Regel bedeutet dies, dass das Element für die EVENTUAL-Entfernung aus der API markiert ist. Handelt es sich um eine Methode, die extern aufgerufen wird - wie bei anderen Plugins oder Entwicklern? Wenn diese Methode nur intern vom Plugin verwendet wird, können Sie sie wahrscheinlich sicher entfernen und durch eine bessere Namensfunktion ersetzen.

Wenn nicht, würde ich die besser benannte Funktion erstellen und die schlecht benannte Funktion mit einem __doing_it_wrongAufruf aufrufen lassen - lesen Sie darüber im Codex. Dadurch haben andere Entwickler Zeit, ihre Verweise auf die Methode zu aktualisieren, und Sie können die Methode in sicher entfernen eine spätere Version.

function badly_named() {

    __doing_it_wrong( 'badly_named', 'This method has been deprecated in favor of better_named_function' );

    /**
     * Call the better named method
     */
     better_named_function();
}

Hoffe das hilft!

Welcher
quelle
Vielen Dank dafür, aber ich denke, ich sollte kopieren, wie Kern es macht. Schauen Sie sich die Antwort von @birgire als Beispiel an
henrywright 22.12.15
Klingt gut für mich :)
Welcher
1

Sie erstellen ein neues Plugin und raten Ihren Benutzern, darauf zu migrieren, da das aktuelle Plugin EOL ist.

Es gibt nichts ärgerlicheres als Plugin- und Theme-Autoren, die ihre öffentlichen APIs ändern und versuchen, sie als "nur ein weiteres kleines Upgrade" zu behandeln. Es gibt keinen Grund, Websites aufgrund eines Problems zu brechen, von dem Ihre Benutzer tatsächlich nicht betroffen sind.

Mark Kaplun
quelle
Meine Benutzer wären davon völlig betroffen, wenn ein anderes Plugin eine Funktion mit genau demselben Namen hätte (und keine Namespaces verwendet).
Henrywright
Nein, die Aktivierung des Plugins schlägt fehl und sie beschweren sich bei Ihnen oder dem Autor des anderen Plugins. Gesamtstörungszeit ca. Null. Wenn beide Plugins auf ein neues Plugin aktualisiert werden müssen, sollte die Aktualisierung nicht länger als 15 Minuten dauern, ohne dass die Funktionsweise der Site beeinträchtigt wird. Sie möchten, dass einige Ihrer Benutzer ein Upgrade durchführen und feststellen, dass einige Funktionen ohne Vorankündigung nicht mehr funktionieren. Zeit zu reparieren? Glauben Sie, dass sie überhaupt ein Backup haben und es reparieren können?
Mark Kaplun
Sobald Sie eine API erstellt haben, müssen Sie diese für immer unterstützen oder zumindest so lange, bis sie völlig irrelevant ist. WordPress hat beispielsweise keine der veralteten APIs seit 3.4 entfernt, und das Hinzufügen eines Hinweises hilft Ihnen nichts.
Mark Kaplun
1
+1 weil ich Ihre Meinung respektiere und was ich an dieser Seite genieße, sind die unterschiedlichen Ansichten, Ansätze und Lösungen für Probleme, weil es normalerweise keine Einheitsgröße gibt, die für alle passt.
Birgire
1

Ich würde folgendes vorschlagen:

/**
 * @deprecated Please use good_function_name() instead
 * @since x.y.z Marked deprecated in favor of good_function_name()
 * @see good_function_name()
 */
function bad_function_name() {
    trigger_error(
        'The ' . __FUNCTION__ . ' function is deprecated. ' .
        'Please use good_function_name() instead.',
        defined( 'E_USER_DEPRECATED' ) ? E_USER_DEPRECATED : E_USER_WARNING
    );

    return good_function_name();
}

Dies hat zur Folge, dass in den Protokollen eine Verfallswarnung zusammen mit einem Stack-Trace angezeigt wird. Dies funktioniert natürlich nur, wenn die Protokollierung in WordPress aktiviert ist.

Der ternäre Operator ist da, weil die Konstante E_USER_DEPRECATED nur in PHP 5.3.0 eingeführt wurde. In älteren Versionen können wir stattdessen auf eine einfache Benutzerwarnung zurückgreifen.

Aus dem PHP-Handbuch zu Fehlerkonstanten :

E_DEPRECATED Laufzeitbenachrichtigungen. Aktivieren Sie diese Option, um Warnungen zu Code zu erhalten, der in zukünftigen Versionen nicht mehr funktioniert.

Der Grund, warum ich _doing_it_wrong oder __deprecated_function nicht gerne benutze, ist, dass diese Funktionen nur für WordPress Core gedacht sind. Aus der Code-Referenz zu diesen Funktionen:

Der Zugriff dieser Funktion ist als privat gekennzeichnet. Dies bedeutet, dass es nicht für Plugin- oder Theme-Entwickler gedacht ist, sondern nur für andere Kernfunktionen. Der Vollständigkeit halber ist es hier aufgeführt.

alexg
quelle
1
Das ist ein absolut gültiger Punkt +1 - wir können jedoch feststellen, dass Plugins wie Woocommerce beide Funktionen verwenden . ungeachtet.
Birgire