web-dev-qa-db-ja.com

Remove_filterが機能しないのはいつですか?

remove_filterはある状況下では動作しないという報告があります、そして代替案を提供するべきです 。しかし、この記事では、これがどのような状況下で起こるのかを明確にはしていません。

私はWordPressとPHPバージョン、そして最終的に提供される他の関連情報で、remove_filterを壊すコード例を探しています。私は次のスニペットが使えるテンプレートであるべきだと思います:

<?php
include('wp-load.php');

function filtertest_function($value)
{
    return 'Filtered';
}

var_dump(apply_filters('filtertest', 'Original value'));
add_filter('filtertest', 'filtertest_function');
var_dump(apply_filters('filtertest', 'Original value'));
remove_filter('filtertest', 'filtertest_function');
var_dump(apply_filters('filtertest', 'Original value'));

これは期待されたものを返します。

string(14) "Original value"
string(8) "Filtered"
string(14) "Original value"

フィルタがクラスの一部である場合、または複数のフィルタが使用されている場合は、エラーが発生すると思います。 _wp_filter_build_unique_idが関与していることがわかります 。そのコードのエラーの原因がどこにあるかを指摘してください。

3
Jan Fabry

まあこれはどういうわけかWordpressの開発問題にバインドされている非常に具体的なトピックです。私の記事が気に入った場合は、tracのチケットを追跡することを強くお勧めします。それが、問題が発生したときに技術的に回避する方法を見つけるために私が想定できる最も良いことです(嫌いならremove_filter()回答)。

理論的な観点から考えてみてください。使用可能なデータ型がすべての可能な値で同じ機能を保証するために厳密に扱われていないということです(f(n)!= f(n))。一言で言えば:壊れたデザイン。

これは実際には常に破綻することを意味しますか? - いいえ!それは時々起こることができるということです。そしてremove_filter()に頼る必要があるときに罠にかけられます。

もっと良い提案はこれかもしれません:クラスメソッドとしてフックを利用するプラグインを開発する場合、プラグインがPHP 5.2/5.3のインストールで実行されることを確認してください。

技術的な議論はtracのチケットに保管してください。そして、あなたが真剣に興味を持っているのなら、現在のデザインの欠点を直すのを手伝ってください。

3
hakre

DenisがHakreのブログにコメントしたように、これは問題の非常に基本的な例です。

function run_me_once() {
    remove_action( 'foobar', 'run_me_once' );
    echo 'test....';
}
add_action( 'foobar', 'run_me_once' );

function run_me2() {
    echo 'test2....';
}
add_action( 'foobar', 'run_me2', 11 );

echo '';
do_action( 'foobar' ); // test....
echo '';
echo '';
do_action( 'foobar' ); // test2....
echo '';

ただし、そのコードを実行する前に、自分で考えてみてください。結果はどうなるでしょうか。結果がどうなるべきか決まったら、それを実行して何が起こるのかを確認します。

1
t31os