Bir eylem / filtreye hangi fonksiyonların bağlı olduğunu nasıl bilebilirim?


32

Hangi fonksiyonların belirli bir kancaya bağlandığını bilmenin bir yolu var mı? Örneğin, hangi fonksiyonların kancaya bağlı olduğunu bilmek istersem wp_head.


İstediğin şeyin bu olduğuna eminim: @ Rarst's Debug WordPress hooks
anu

bir göz atın bu cevabı benzer bir soruya ve daha spesifik olarak eklentisi mikrofon tarafından gönderilmiş.
Bainternet

1
Yanılıyor olabilirim ama bu sadece kapsamlı bir kanca listesi oluşturmuyor mu? Bu soruyu okuduğum yol, kancaya hangi fonksiyonların bağlı olduğunu bilmek istiyor.
anu

Kısmen yanlış, "mesela wp_head'e bağlı olan şey" dedi, bu yüzden sadece bir kanca değil, tam bir liste.
Bainternet

Gerçekten, hangi fonksiyonların belirli bir kancaya eklendiğini görmek istedim, bu yüzden örneğin 10 fonksiyonun bağlanması durumunda, bu 10'u wp_headlistelemek istiyorum.
Javier Villanueva

Yanıtlar:


16

Global değişkene bakın $wp_filter. Bir örnek için tüm yorum filtrelerinin bir listesi için eklentime bakın :

<?php
/*
Plugin Name: List Comment Filters
Description: List all comment filters on wp_footer
Version:     1.1
Author:      Fuxia Scholz
License:     GPL v2
*/

add_action( 'wp_footer', 'list_comment_filters' );

function list_comment_filters()
{
    global $wp_filter;

    $comment_filters = array ();
    $h1  = '<h1>Current Comment Filters</h1>';
    $out = '';
    $toc = '<ul>';

    foreach ( $wp_filter as $key => $val )
    {
        if ( FALSE !== strpos( $key, 'comment' ) )
        {
            $comment_filters[$key][] = var_export( $val, TRUE );
        }
    }

    foreach ( $comment_filters as $name => $arr_vals )
    {
        $out .= "<h2 id=$name>$name</h2><pre>" . implode( "\n\n", $arr_vals ) . '</pre>';
        $toc .= "<li><a href='#$name'>$name</a></li>";
    }

    print "$h1$toc</ul>$out";
}

Örnek çıktı pre_comment_author_email:

array (
  10 => 
  array (
    'trim' => 
    array (
      'function' => 'trim',
      'accepted_args' => 1,
    ),
    'sanitize_email' => 
    array (
      'function' => 'sanitize_email',
      'accepted_args' => 1,
    ),
    'wp_filter_kses' => 
    array (
      'function' => 'wp_filter_kses',
      'accepted_args' => 1,
    ),
  ),
)

Büyük küçük fonksiyon toscho, bunu paylaştığın için teşekkürler. Kapatma eyleminde bir tema için yüklenen tüm eylem kancalarını değerlendirmek için kullanıyorum.
Kevin Leary

11

Belirli bir işlem kancasına bağlı olan işlevlerin veya işlemlerin listesini görmek için aşağıdaki kodu kullanabilirsiniz.

global $wp_filter;
echo '<pre>';
var_dump( $wp_filter['wp_head'] );
echo '</pre>';

5

Hata ayıklama amaçları için basit

global $wp_filter;
echo "<pre>" . print_r($wp_filter, true) . "</pre>";

yapardım ...


1
Benim durumumda, arama var_dump($wp_filter)çok fazla çıktı üretti. Kullanmayı tercih ettim var_dump($wp_filter["<action name>"]). (Aynı şey için geçerli print_r- Ben şahsen var_dump tercih ettim.)
Acsor

4

Bu, daha okunaklı bir filtre listesi gösterir

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

    $ret='';
    foreach($wp_filter[$hook] as $priority => $realhook){
        foreach($realhook as $hook_k => $hook_v){
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            $ret.=  "\n$priority $hook_echo";
        }

    }
     return $ret;
}

0

@ User3623530 adlı kullanıcının yanıtını faydalı buldum, ancak bazen Kapakların bağlanabileceği gerçeğini hesaba katmadı. İşte benim daha ayrıntılı (ve çirkin) versiyonum:

if( isset($wp_filter[$filterName]) ){
    foreach( $wp_filter[$filterName] as $priority => $hooks){
        foreach ($hooks as $hook_k => $hook_v) {
            $hook_echo=(is_array($hook_v['function'])?get_class($hook_v['function'][0]).':'.$hook_v['function'][1]:$hook_v['function']);
            if(is_object($hook_echo) && ($hook_echo instanceof Closure)){
                $hook_echo="closure";
            }
            error_log($filterName." HOOKED (".serialize($priority)."): ".serialize($hook_k)."".serialize($hook_echo));
        }
    }
} else {
    error_log($filterName." NO FILTERS HOOKED");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.