webentwicklung-frage-antwort-db.com.de

Wie verwerfe ich eine in einem Plugin verwendete Funktion?

Eine der Funktionen, die ich in meinem Plugin verwende, verschmutzt den globalen Bereich mit einem Namen, der mit einer anderen Funktion kollidieren könnte (in einem anderen Plugin verwendet). Ich denke, ich sollte es ablehnen. Aber wie soll ich das anstellen?

function foo() {
    echo 'bar';
}

Ich kenne _deprecate_function(), wäre aber dankbar für ein Beispiel, das alle Schritte zeigt, die ich unternehmen sollte, um die Funktion aus dem Kern meines Plugins zu entfernen.

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

15
henrywright

Zusätzlich zur Antwort von @Welcher:

Es gibt einige gute " graveyard " Beispiele im Kern, bei denen "Funktionen sterben".

Sie können sie als Richtlinien verwenden, z. bezüglich der Dokumentation.

Hier ist ein Beispiel für die permalink_link() unter wp-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 Funktion _deprecated_function , in der die Eingabeargumente erläutert werden:

/**
 * 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.
 */
9
birgire

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_wrong-Aufruf aufrufen lassen - lesen Sie darüber im Codex Dies gibt anderen Entwicklern Zeit, ihre Referenzen auf die Methode zu aktualisieren, und Sie können entfernen Sie die Methode sicher in einer späteren 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!

7
Welcher

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 auf diese 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.

1
alexg

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.

1
Mark Kaplun