web-dev-qa-db-fra.com

remplacer les fonctions pluggable.php

Je veux non seulement redéfinir un pluggable function (wp_new_user_notification), mais je veux m'assurer que si un autre plug-in est en train de surcharger la même fonction, ma fonction doit donc également être remplacée ou je veux que ma fonction remplacée fonctionne à la place d'un autre plug-in. remplacer la même fonction (wp_new_user_notification). Peut-être une question idiote mais puis-je le faire?

1
Chaudhry Waqas

La réponse courte à votre question est oui; Cependant, les méthodes pour ce faire sont un peu compliquées et généralement, je les déconseillerais à moins que cela ne soit absolument nécessaire.

Étant donné que pluggable functions remplace en fait la fonction stock par function_exists(), le plug-in qui "branche" la fonction en premier gagnera. Ce que vous voulez faire, c'est que votre plugin soit chargé en premier dans le monde.

Les plugins sont chargés en fonction de leur ordre dans un tableau stocké dans la table wp_options. Ce tableau est trié par ordre alphabétique. Sachant cela, vous avez 2 options.

  1. Il est très probable que votre plugin apparaisse en ordre alphabétique d'abord. I crois que @ est considéré alphabétiquement d’abord en php, donc si vous commencez le nom de votre plugin avec quelque chose comme @@MyPlugin, alors il devrait être chargé en premier.
  2. Modifiez l'ordre du tableau stocké dans la base de données à l'aide du crochet activated_plugin. J'ai effectué une recherche rapide sur Google et découvert que quelqu'un avait déjà écrit une fonction ici . Je l'ai republié ci-dessous au cas où le lien disparaîtrait.

    add_action( 'activated_plugin', 'my_plugin_load_first' );
    function my_plugin_load_first(){
        $path = str_replace( WP_PLUGIN_DIR . '/', '', __FILE__ );
        if ( $plugins = get_option( 'active_plugins' ) ) {
            if ( $key = array_search( $path, $plugins ) ) {
                array_splice( $plugins, $key, 1 );
                array_unshift( $plugins, $path );
                update_option( 'active_plugins', $plugins );
            }
        }
    }
    

    Placez cette fonction dans votre plugin et il réorganisera le tableau de sorte que votre plugin soit chargé en premier.

L'autre option que vous avez est d'omettre l'instruction if( function_exists()) lorsque vous déclarez votre version de la fonction. Si vous faites cela, et que quelqu'un d'autre a branché cette fonction, php se fermera avec une erreur fatale "la fonction existe déjà". Cela aura pour effet d'empêcher quelqu'un d'autre de brancher la fonction, mais cela empêchera également le chargement du site, je doute donc que ce soit une option viable pour vous.

2
TheGentleman

Juste besoin de créer un petit commentaire ici. Les fonctions plug-in sont introduites dans les premiers jours de WordPress (version 1.5.1), lorsque nous n'avions que quelques plug-ins. De nos jours, quand de nombreux plugins peuvent utiliser la même fonction (disons: wp_mail), nous avons des problèmes.

J'ai trouvé cet article de blog a le sens. Ce qu’il a suggéré comme solution aux fonctions enfichables est d’utiliser des filtres. Il a appelé la méthode court-circuiter , où à la place de ceci:

if ( ! function_exists( 'f1' ) ){
function f1( $name ) {
    echo 'Hello ' . $name;
}
}

tu aurais :

function f1( $name ) {      
    $pre = apply_filters( 'f1', false, $name );    
    if ( false !== $pre ) {
        echo $pre;
        return;
    }    
    echo 'Hello ' . $name;
}

Génial, mais je peux imaginer la solution sans même utiliser la fonction enfichable. Il vous suffit de copier/coller le code de la fonction plug-in vers votre nouvelle fonction plug-in ayant un nom/classe différent et que vous avez terminé.

Bien sûr, si la fonction plug-in change, il vous suffit de publier la nouvelle version du plug-in.

0
prosti