it-swarm.dev

Kdy nefunguje remove_filter?

Existují zprávy, že remove_filter nefunguje za určitých okolností a že bychom měli poskytnout alternativy . Článek však ve skutečnosti nevyjasňuje, za jakých okolností se to děje.

Hledám příklady kódu, které rozbijí remove_filter, s verzí WordPress a PHP a případně dalšími relevantními informacemi. Následující úryvek by měl být použitelnou šablonou:

<?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'));

Tím se vrátí očekávané:

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

Věřím, že chyba nastane v některých případech, kdy je filtr součástí třídy, nebo se používá více filtrů. Rozumím _wp_filter_build_unique_idje zapojen . Uveďte prosím, kde v tomto kódu je zdroj chyby.

3
Jan Fabry

No to je nějak velmi specifické téma, které je vázáno na vývoj Wordpress problém. Důrazně vám doporučuji sledovat trac lístek, pokud se vám líbil můj článek. To je to nejlepší, co můžu předpokládat, když zjistím, kdy se objevují problémy, a jak je technicky obejít (pokud se vám nelíbí nepoužívejte remove_filter() - odpověď).

Vezměme si to z teoretického hlediska: Je to jen to, že použité datové typy nejsou striktně řešeny, aby byla zajištěna stejná funkčnost na všech možných hodnotách (f (n)! = F (n)). Stručně řečeno: zlomený design.

Znamená to, že se v praxi vždy rozbije? - Ne! Někdy se to může stát. A pak jste uvězněni, když potřebujete spoléhat na remove_filter().

Lepší návrh by mohl být tento: Pokud vytvoříte pluginy, které využívají háčky jako metody třídy, zajistěte, aby byl plugin spuštěn na instalacích s PHP 5.2/5.3.

Udržujte technickou diskusi v trac lístku. A pokud máte vážný zájem, pomozte prosím napravit nedostatky stávajícího designu.

3
hakre

Jak Denis komentoval Hakreův blog, je to velmi základní příklad problému.

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 '';

Než spustíte tento kód, zeptejte se sami sebe, co byste očekávali. Jakmile se rozhodnete, jaký by měl být výsledek, spusťte jej a uvidíte, co se stane.

1
t31os