सवाल वर्डप्रेस: ​​मैं 'the_content' फ़िल्टर के लिए सभी पंजीकृत फ़ंक्शंस कैसे प्राप्त करूं?


मेरे पास वर्डप्रेस, विशेष रूप से संस्करण 3.0 और नए के बारे में एक सवाल है।

क्या कोई जानता है कि किसी भी सरणी या सभी कार्यों की सूची कैसे प्राप्त की जाएंगी या @content फ़िल्टर में 'पंजीकृत' हैं?

विचार है कि फ़िल्टर से हटाने के लिए संभावित कार्यों की एक चेकबॉक्स सूची उत्पन्न करना, जैसे wpautop। मुझे पता है कि फिल्टर से फ़ंक्शन को हार्ड कोड किए गए लेबल के साथ कैसे हटाया जाए, लेकिन मैं एक और गतिशील समाधान बनाने की उम्मीद कर रहा हूं।

अगर किसी के पास कोई विचार है तो यह संभव है और यह कैसे किया जा सकता है, मुझे बहुत दिलचस्पी होगी। धन्यवाद।


44
2018-03-07 19:25


मूल




जवाब:


फ़िल्टर सरणी से मुद्रित करने के लिए सरल कार्य?

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

इसे कॉल करें जहां आपको इसकी आवश्यकता है।

print_filters_for( 'the_content' );

99
2018-03-07 20:44



बहुत बढ़िया। उत्तर के लिए धन्यवाद, मुझे wp_filter वैश्विक के बारे में कोई जानकारी नहीं थी, लेकिन अब यह सब समझ में आता है। चीयर्स :) - macguru2000
एक जादू की तरह काम करता है! धन्यवाद! - jroi_web


यह एक और अधिक उन्नत उदाहरण है, जो डेटा के अलावा होगा $wp_filter सरणी, फ़ाइल का पथ दिखाएं जहां हुक संलग्न है, साथ ही कोड में रेखा जहां फ़ंक्शन परिभाषित किया गया है।

किसी विशिष्ट क्रिया (या फ़िल्टर) पर लगाए गए कार्यों की मूल सूची प्राप्त करने के लिए यह फ़िल्टर सरणी से आइटम लाने के लिए पर्याप्त है, लेकिन चूंकि फ़ंक्शंस को विभिन्न तरीकों से जोड़ा जा सकता है (क्लास विधि या बंद होने के रूप में) उस सूची में शामिल होगा एक प्रासंगिक डेटा का एक टन जिसमें स्ट्रिंग के रूप में प्रस्तुत वस्तुओं को शामिल किया गया है। प्राथमिकता के क्रम में, यह उदाहरण केवल प्रासंगिक डेटा प्रदर्शित करेगा:

  • फ़ंक्शन का नाम (कॉलबैक सिंटैक्स के आधार पर):
    • फ़ंक्शन कॉलबैक: 'function_name'
    • ऑब्जेक्ट विधि: array( $object, 'function_name' )
    • स्थैतिक वर्ग विधि: array( 'class_name', 'function_name' ) तथा 'class_name::function_name'
    • बंद: function() {}
    • सापेक्ष स्थिर वर्ग विधि: array( 'class_name', 'parent::function_name' )
  • स्वीकार किए गए तर्क
  • फ़ाइल का नाम
  • शुरू लाइन
  • आईडी
  • प्राथमिकता

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

चूंकि हुक को पूरे रनटाइम में जोड़ा और हटाया जा सकता है, इसलिए आउटपुट इस बात पर निर्भर करता है कि फ़ंक्शन कहलाता है ( wp_footer पूरी सूची पाने के लिए कार्रवाई एक अच्छी जगह है)

print_r के लिए उदाहरण the_content फिल्टर:

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
        )

    .....

संपादित करें: 2017-05-05

  • के लिए अनुकूलित WP_Hook कक्षा
  • प्राथमिकता जोड़ा गया
  • निश्चित: कॉलबैक मौजूद नहीं होने पर त्रुटि उत्पन्न हुई, हालांकि वर्डप्रेस भी इसके लिए एक चेतावनी उठाता है
  • तय: एक ही आईडी के साथ हुक लेकिन अलग प्राथमिकता पिछले एक को ओवरराइट करता है

18
2017-10-31 18:00



बहुत बढ़िया डीबगिंग 'टूल' - अच्छी तरह से किया गया। - Bilal Akil
एफवाईआई- मैंने अपनी प्लगइन में इसका उपयोग करने की कोशिश की, लेकिन इसे थोड़ा अधिक त्रुटि पकड़ने की आवश्यकता है क्योंकि यह कोई घातक त्रुटि उत्पन्न करता है यदि कोई फ़ंक्शन / विधि जोड़ता है जो मौजूद नहीं है: Fatal error: Uncaught exception 'ReflectionException' with message 'Function Walker_Nav_Menu() does not exist' - helgatheviking
मैंने थोड़ा जोड़ा है try/catch स्वाद यहाँ। - helgatheviking
यह विशेष रूप से बढ़िया होगा अगर यह हुक प्राथमिकता भी प्रदर्शित करता है। - Milo
जैसा $wp_filter है अब एक वर्ग, यह अब काम नहीं करेगा - cameronjonesweb