web-dev-qa-db-ja.com

pluggable.php関数をオーバーライドする

私はpluggable functionwp_new_user_notification)をオーバーライドしたいだけではなく、他のプラグインが同じ関数をオーバーライドしている場合はそれをオーバーライドするか、オーバーライドされた関数を他のプラグインの代わりに動作させたい同じ関数をオーバーライドする(wp_new_user_notification)。愚かな質問かもしれませんが、私はそれをすることができますか?

1
Chaudhry Waqas

あなたの質問に対する短い答えはイエスです。しかし、これを行う方法は少し厄介であり、絶対に必要な場合を除いて、一般的に私はそれらすべてに対して推奨します。

pluggable functionsは実際にはfunction_exists()のどちらかのプラグインが最初に関数を勝ち取るプラグインによってストック関数を置き換えます。あなたがしたいことはあなたのプラグインが最初にグローバルにロードされることを確実にすることです。

プラグインはwp_optionsテーブルに格納されている配列に、それらの順序に従ってロードされます。この配列はアルファベット順にソートされています。それを知って、あなたは2つの選択肢があります。

  1. あなたのプラグインがアルファベット順になっている可能性が非常に高いです。I信じる@はあなたがあなたのプラグイン名を@@MyPluginのような何かで始めるならば、それは最初にロードされるべきです。
  2. activated_pluginフックを使用してデータベースに格納されている配列の順序を変更します。Googleで簡単に検索しましたが、既に関数を書いている人がいます )ここ 。リンクが切れた場合に備えて、私は以下に再投稿しました。

    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 );
            }
        }
    }
    

    この関数をプラグインに入れると、プラグインが最初にロードされるように配列が並べ替えられます。

あなたが持っている他のオプションはあなたが関数のあなたのバージョンを宣言するときにif( function_exists())ステートメントを省略することです。あなたがそうし、そして他の誰かがその関数を接続したならば、phpは致命的なエラー "function already exists"で終了します。これは他の誰かがその機能をプラグインすることを妨げる効果があるでしょうが、それはまたサイトがロードすることを妨げるでしょうから、それはあなたにとって実行可能な選択肢であると私は疑います。

2
TheGentleman

ここにちょっとしたコメントを書く必要があります。プラグイン可能な機能は、WordPress(バージョン1.5.1)の初期の頃に、プラグインがいくつかあったときに導入されました。今日では、多くのプラグインが同じ機能を使用するかもしれません(例えばwp_mail)と、我々は問題を抱えています。

私は このブログ記事 を見つけました。プラグイン可能な関数の解決策として彼が提案したのは、フィルタを使うことです。彼はメソッドをショートサーキットと呼びました。

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

あなたが持っているでしょう:

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

素晴らしいことですが、プラグイン可能な関数を使用していなくても解決策を想像できます。プラグイン可能な関数から、異なる名前/クラスを持つ新しいプラグイン関数にコードを単純にコピー/貼り付けすれば完了です。

もちろん、プラグイン可能な機能が変わった場合は、新しいプラグインバージョンを単純にリリースしてください。

0
prosti