Soru WordPress: 'the_content' filtresi için tüm kayıtlı işlevleri nasıl alabilirim?


WordPress, özellikle sürüm 3.0 ve daha yeni bir soru var.

Bir dizinin nasıl uygulanacağını ya da uygulanacak tüm işlevlerin listesini ya da "içerik" filtresine 'kayıtlı' olduğunu bilen var mı?

Buradaki fikir, wpautop gibi filtreden çıkarmak için olası işlevlerin bir onay kutusu listesi oluşturmaktır. Filtreden sert kodlu etiketlerle işlevlerin nasıl kaldırılacağını biliyorum, ancak daha dinamik bir çözüm üretmeyi umuyorum.

Eğer bunun mümkün olup olmadığı konusunda herhangi bir fikri varsa ve nasıl yapılabiliyorsa çok ilgilenirim. Teşekkürler.


44
2018-03-07 19:25


Menşei




Cevaplar:


Filtre dizisinden yazdırmak için basit işlev?

function print_filters_for( $hook = '' ) {
    global $wp_filter;
    if( empty( $hook ) || !isset( $wp_filter[$hook] ) )
        return;

    print '<pre>';
    print_r( $wp_filter[$hook] );
    print '</pre>';
}

İhtiyacınız olan yerde arayın.

print_filters_for( 'the_content' );

99
2018-03-07 20:44



Muhteşem. Cevabınız için teşekkürler, wp_filter global hakkında hiçbir fikrim yoktu, ama şimdi hepsi mantıklı. Şerefe :) - macguru2000
ÇALIŞIYOR bir cazibe gibi! Teşekkürler! - jroi_web


Bu biraz daha gelişmiş bir örnektir. $wp_filter dizisi, kancanın bağlandığı dosyanın yolunu ve ayrıca işlevin tanımlandığı kod satırını gösterir.

Belirli bir eyleme (veya filtreye) bağlanan fonksiyonların temel bir listesini almak için, öğeleri filtre dizisinden almak yeterlidir, ancak fonksiyonlar çeşitli yollarla (sınıf yöntemi veya kapatma olarak) eklenebileceğinden, dize olarak sunulan nesneleri içeren bir miktar yepyeni veri. Bu örnek, öncelik sırasına göre yalnızca ilgili verileri gösterecektir:

  • işlev adı (geri arama sözdizimine bağlı olarak):
    • işlev geri çağırma: 'function_name'
    • nesne yöntemi: array( $object, 'function_name' )
    • statik sınıf yöntemi: array( 'class_name', 'function_name' ) ve 'class_name::function_name'
    • kapatma: function() {}
    • göreceli statik sınıf yöntemi: array( 'class_name', 'parent::function_name' )
  • kabul edilen args
  • dosya adı
  • başlama çizgisi
  • İD
  • öncelik

function list_hooks( $hook = '' ) {
    global $wp_filter;

    if ( isset( $wp_filter[$hook]->callbacks ) ) {      
        array_walk( $wp_filter[$hook]->callbacks, function( $callbacks, $priority ) use ( &$hooks ) {           
            foreach ( $callbacks as $id => $callback )
                $hooks[] = array_merge( [ 'id' => $id, 'priority' => $priority ], $callback );
        });         
    } else {
        return [];
    }

    foreach( $hooks as &$item ) {
        // skip if callback does not exist
        if ( !is_callable( $item['function'] ) ) continue;

        // function name as string or static class method eg. 'Foo::Bar'
        if ( is_string( $item['function'] ) ) {
            $ref = strpos( $item['function'], '::' ) ? new ReflectionClass( strstr( $item['function'], '::', true ) ) : new ReflectionFunction( $item['function'] );
            $item['file'] = $ref->getFileName();
            $item['line'] = get_class( $ref ) == 'ReflectionFunction' 
                ? $ref->getStartLine() 
                : $ref->getMethod( substr( $item['function'], strpos( $item['function'], '::' ) + 2 ) )->getStartLine();

        // array( object, method ), array( string object, method ), array( string object, string 'parent::method' )
        } elseif ( is_array( $item['function'] ) ) {

            $ref = new ReflectionClass( $item['function'][0] );

            // $item['function'][0] is a reference to existing object
            $item['function'] = array(
                is_object( $item['function'][0] ) ? get_class( $item['function'][0] ) : $item['function'][0],
                $item['function'][1]
            );
            $item['file'] = $ref->getFileName();
            $item['line'] = strpos( $item['function'][1], '::' )
                ? $ref->getParentClass()->getMethod( substr( $item['function'][1], strpos( $item['function'][1], '::' ) + 2 ) )->getStartLine()
                : $ref->getMethod( $item['function'][1] )->getStartLine();

        // closures
        } elseif ( is_callable( $item['function'] ) ) {     
            $ref = new ReflectionFunction( $item['function'] );         
            $item['function'] = get_class( $item['function'] );
            $item['file'] = $ref->getFileName();
            $item['line'] = $ref->getStartLine();

        }       
    }

    return $hooks;
}

Kancalar tüm çalışma zamanı boyunca eklendiğinden ve çıkarılabildiğinden, çıktı fonksiyonun hangi noktada çağrıldığına bağlıdır ( wp_footer eylem tam listeyi almak için iyi bir yer.)

print_r için örnek the_content filtre:

Array
(
    [0] => Array
        (
            [id] => 000000004c8a4a660000000011808a14run_shortcode
            [priority] => 8
            [function] => Array
                (
                    [0] => WP_Embed
                    [1] => run_shortcode
                )

            [accepted_args] => 1
            [file] => C:\xampp\htdocs\wordpress\wp-includes\class-wp-embed.php
            [line] => 58
        )

    [1] => Array
        (
            [id] => wptexturize
            [priority] => 10
            [function] => wptexturize
            [accepted_args] => 1
            [file] => C:\xampp\htdocs\wordpress\wp-includes\formatting.php
            [line] => 41
        )

    [2] => Array
        (
            [id] => 0000000006c5dc6d0000000064b1bc8e
            [priority] => 10
            [function] => Closure
            [accepted_args] => 1
            [file] => C:\xampp\htdocs\wordpress\wp-content\plugins\plugin\plugin.php
            [line] => 16
        )

    .....

Düzenleme: 2017-05-05

  • için uyarlanmış WP_Hook sınıf
  • öncelik eklendi
  • Sabit: WordPress de bunun için bir uyarı yükseltir rağmen, geri arama yoksa, hata kaldırdı
  • Sabit: Aynı kimlik ile kanca ama farklı öncelik önceki öncekinin üzerine yazar

18
2017-10-31 18:00



Müthiş hata ayıklama 'aracı' - aferin. - Bilal Akil
FYI- Bunu eklentimde kullanmayı denedim, ancak birisi var olmayan bir işlev / yöntem eklediğinde önemli bir hata oluşturduğunda biraz hata yakalaması gerekiyor: Fatal error: Uncaught exception 'ReflectionException' with message 'Function Walker_Nav_Menu() does not exist' - helgatheviking
Biraz ekledim try/catch lezzet İşte. - helgatheviking
Kanca önceliği de görüntülendiğinde bu özellikle harika olur. - Milo
Gibi $wp_filter olduğu şimdi bir sınıfBu artık çalışmayacak - cameronjonesweb