सुप्त हुक संदर्भ उत्पन्न करें


10

ऐसा लगता है कि बहुत सारे प्लगइन डेवलपर्स फ़िल्टर / एक्शन हुक जोड़ने के लिए समय लेते हैं ताकि उपयोगकर्ताओं को अपने उत्पादों की कार्यक्षमता को मोड़ सकें। जो बहुत अच्छा है, लेकिन वे जो अक्सर नहीं करते हैं वह हुक की एक सूची प्रदान करता है और वे कितने तर्क लेते हैं।

क्या किसी को प्लगइन (या थीम) निर्देशिका में इंगित करने और सभी उपलब्ध हुक की सूची देखने का सबसे अच्छा स्वचालित तरीका मिला है?

मुझे कुछ प्लगइन्स लगते हैं जो हुक के लिए स्कैन करते हैं, लेकिन जहां तक ​​मैं बता सकता हूं, वे आपको दिखाते हैं कि वास्तव में किसी दिए गए पृष्ठ को रेंडर करने के लिए किसे बुलाया जा रहा है। जो मुझे मिलता है वह काम हो सकता है। लेकिन कभी-कभी अगर मुझे पता है कि मैं एक विशेष प्लगइन के साथ बातचीत कर रहा हूं, तो मैं हर उस स्थान को जानना चाहता हूं जो मुझे एक कार्रवाई या फ़िल्टर हुक करने दे।

तो मैं वास्तव में क्या देख रहा हूँ कुछ ऐसा है, जो एक प्लगइन रूट डायरेक्टरी को देखते हुए एक सूची बनाएगा जहाँ प्रत्येक आइटम में शामिल हैं:

  • टैग
  • प्रकार (कार्रवाई या फ़िल्टर)
  • तर्कों की संख्या
  • जहां इसे स्रोत में (के माध्यम do_action()से apply_filter()) कहा जाता है

एक स्क्रिप्ट बहुत अच्छी होगी क्योंकि यह पूरी तरह से अच्छी तरह से HTMLify कर सकता है और इसे सही तरीके से मुझे व्यवस्थापक UI में हर प्लगइन के लिए दिखा सकता है। लेकिन यहां तक ​​कि एक कमांड-लाइन स्क्रिप्ट जो एक उपयोगी स्थिर फ़ाइल को आउटपुट करती है वह बहुत अच्छा होगा।


तो सवाल क्या है? यदि आप एक प्लगइन की सिफारिश के लिए देखते हैं तो यह यहाँ पर विषय है
मार्क कप्लून

क्षमा करें, वर्डप्रेस डेवलपमेंट मेटा वीड्स में बहुत दूर नहीं जाना चाहते हैं, लेकिन क) मैं यहां नया हूं इसलिए मुझे पता नहीं चला कि प्लगइन सिफारिशों के लिए ओटी थे। मेरे पास ... कुछ राय ... उस पर, लेकिन फिर भी, मुझे पहले यह महसूस करना चाहिए था। बी) OTOH, मैं सिर्फ अपने सवाल का कोई हल खोजने की कोशिश कर रहा हूं, चाहे एक मौजूदा प्लगइन या शेल स्क्रिप्ट, या खरोंच से कुछ। तो सवाल कड़ाई से एक प्लगइन सिफारिश अनुरोध है!
योनट्रॉन

ठीक है, ऐसा लगता है कि बाकी सभी लोग मज़े कर रहे हैं ताकि कोई नुकसान न हो। प्रश्न पर मेरी "आपत्ति" वास्तव में एक पाठ पार्सिंग प्रश्न होने के बारे में अधिक थी, जो लोगों के लिए है कि संकलक शैली सॉफ्टवेयर लिखना पसंद है लेकिन वास्तविक वर्डप्रेस कोडिंग के साथ बहुत कम है। रिकॉर्ड के लिए भी सवाल जो wordpress.org के बारे में हैं जैसे कि एक प्लगइन कैसे सबमिट करें, आमतौर पर ऑफ-टॉपिक के रूप में वोट किया जाएगा।
मार्क कप्लून

जवाबों:


6

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

निष्क्रिय फ़िल्टर और कार्यों के लिए, मैंने दो बहुत ही बुनियादी कार्य लिखे हैं ( कुछ मदद यहाँ और वहाँ के साथ ) जो एक फ़ाइल में सभी apply_filtersऔर do_actionउदाहरणों को ढूँढता है और फिर प्रिंट करता है

मूल बातें

  • हम का उपयोग करेगा RecursiveDirectoryIterator, RecursiveIteratorIteratorऔर RegexIteratorपीएचपी कक्षाएं एक निर्देशिका में सभी PHP फ़ाइलों मिलता है। उदाहरण के लिए, मेरी लोकलहोस्ट पर, मैंने उपयोग किया हैE:\xammp\htdocs\wordpress\wp-includes

  • हम फिर फ़ाइलों के माध्यम से लूप करेंगे, और खोज करेंगे और वापस ( preg_match_all) apply_filtersऔर सभी उदाहरणों के और do_action। मैंने इसे कोष्ठकों के नेस्टेड उदाहरणों से मेल खाने के लिए स्थापित किया है और साथ ही apply_filters/ do_actionपहले कोष्ठक के बीच संभव व्हाट्सएप से मिलान करने के लिए भी

हम फिर सभी फ़िल्टर और क्रियाओं के साथ एक सरणी बनाएंगे और फिर सरणी के माध्यम से लूप करेंगे और फ़ाइल नाम और फ़िल्टर और क्रियाओं को आउटपुट करेंगे। हम फिल्टर / कार्यों के बिना फ़ाइलों को छोड़ देंगे

महत्वपूर्ण लेख

  • यह कार्य बहुत महंगे हैं। उन्हें केवल स्थानीय परीक्षण स्थापना पर चलाएँ।

  • आवश्यकतानुसार कार्यों को संशोधित करें। आप आउटपुट को फ़ाइल में लिखने का निर्णय ले सकते हैं, उसके लिए एक विशेष बैकएंड पेज बना सकते हैं, विकल्प असीमित हैं

विकल्प 1

पहला विकल्प फ़ंक्शन बहुत सरल है, हम एक फ़ाइल की सामग्री का उपयोग करके स्ट्रिंग के रूप में वापस करेंगे file_get_contents, apply_filters/ do_actionउदाहरणों की खोज करेंगे और बस फ़ाइल नाम और फ़िल्टर / एक्शन नामों को आउटपुट करेंगे।

मैंने आसान अनुसरण करने के लिए कोड टिप्पणी की है

function get_all_filters_and_actions( $path = '' )
{
    //Check if we have a path, if not, return false
    if ( !$path ) 
        return false;

    // Validate and sanitize path
    $path = filter_var( $path, FILTER_SANITIZE_URL );
    /**
     * If valiadtion fails, return false
     *
     * You can add an error message of something here to tell
     * the user that the URL validation failed
     */
    if ( !$path ) 
        return false;

    // Get each php file from the directory or URL  
    $dir   = new RecursiveDirectoryIterator( $path );
    $flat  = new RecursiveIteratorIterator( $dir );
    $files = new RegexIterator( $flat, '/\.php$/i' );

    if ( $files ) {

        $output = '';
        foreach($files as $name=>$file) {
            /**
             * Match and return all instances of apply_filters(**) or do_action(**)
             * The regex will match the following
             * - Any depth of nesting of parentheses, so apply_filters( 'filter_name', parameter( 1,2 ) ) will be matched
             * - Whitespaces that might exist between apply_filters or do_action and the first parentheses
             */
            // Use file_get_contents to get contents of the php file
            $get_file_content =  file_get_contents( $file );
            // Use htmlspecialchars() to avoid HTML in filters from rendering in page
            $save_content = htmlspecialchars( $get_file_content );
            preg_match_all( '/(apply_filters|do_action)\s*(\([^()]*(?:(?-1)[^()]*)*+\))/', $save_content, $matches );

            // Build an array to hold the file name as key and apply_filters/do_action values as value
            if ( $matches[0] )
                $array[$name] = $matches[0];
        }
        foreach ( $array as $file_name=>$value ) {

            $output .= '<ul>';
                $output .= '<strong>File Path: ' . $file_name .'</strong></br>';
                $output .= 'The following filters and/or actions are available';
                foreach ( $value as $k=>$v ) {
                    $output .= '<li>' . $v . '</li>';
                }
            $output .= '</ul>';
        }
        return $output;
    }

    return false;
}

आप एक टेम्पलेट, फ्रंटएंड या बैकएंड पर अनुसरण कर सकते हैं

echo get_all_filters_and_actions( 'E:\xammp\htdocs\wordpress\wp-includes' );

यह छपेगा

यहाँ छवि विवरण दर्ज करें

विकल्प 2

यह विकल्प चलाने के लिए थोड़ा अधिक महंगा है। यह फ़ंक्शन उस पंक्ति संख्या को लौटाता है जहाँ फ़िल्टर / क्रिया पाई जा सकती है।

यहां हम fileफाइल को एक एरे में विस्फोट करने के लिए उपयोग करते हैं, फिर हम फिल्टर / एक्शन और लाइन नंबर को खोजते हैं और वापस करते हैं

function get_all_filters_and_actions2( $path = '' )
{
    //Check if we have a path, if not, return false
    if ( !$path ) 
        return false;

    // Validate and sanitize path
    $path = filter_var( $path, FILTER_SANITIZE_URL );
    /**
     * If valiadtion fails, return false
     *
     * You can add an error message of something here to tell
     * the user that the URL validation failed
     */
    if ( !$path ) 
        return false;

    // Get each php file from the directory or URL  
    $dir   = new RecursiveDirectoryIterator( $path );
    $flat  = new RecursiveIteratorIterator( $dir );
    $files = new RegexIterator( $flat, '/\.php$/i' );

    if ( $files ) {

        $output = '';
        $array  = [];
        foreach($files as $name=>$file) {
            /**
             * Match and return all instances of apply_filters(**) or do_action(**)
             * The regex will match the following
             * - Any depth of nesting of parentheses, so apply_filters( 'filter_name', parameter( 1,2 ) ) will be matched
             * - Whitespaces that might exist between apply_filters or do_action and the first parentheses
             */
            // Use file_get_contents to get contents of the php file
            $get_file_contents =  file( $file );
            foreach ( $get_file_contents as  $key=>$get_file_content ) {
                preg_match_all( '/(apply_filters|do_action)\s*(\([^()]*(?:(?-1)[^()]*)*+\))/', $get_file_content, $matches );

                if ( $matches[0] )
                    $array[$name][$key+1] = $matches[0];
            }
        }

        if ( $array ) {
            foreach ( $array as $file_name=>$values ) {
                $output .= '<ul>';
                    $output .= '<strong>File Path: ' . $file_name .'</strong></br>';
                    $output .= 'The following filters and/or actions are available';

                    foreach ( $values as $line_number=>$string ) {
                        $whitespaces = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
                        $output .= '<li>Line reference ' . $line_number . $whitespaces . $string[0] . '</li>';
                    }
                $output .= '</ul>';
            }
        }
        return $output;

    }

    return false;
}

आप एक टेम्पलेट, फ्रंटएंड या बैकएंड पर अनुसरण कर सकते हैं

echo get_all_filters_and_actions2( 'E:\xammp\htdocs\wordpress\wp-includes' );

यह छपेगा

यहाँ छवि विवरण दर्ज करें

संपादित करें

यह मूल रूप से उतना ही है जितना मैं बिना स्क्रिप्ट के टाइम आउट या मेमोरी से रनिंग के कर सकता हूं। विकल्प 2 में कोड के साथ, उक्त फाइल में जाना उतना ही आसान है और स्रोत कोड में लाइन कहा गया है और फिर फ़िल्टर / कार्रवाई के सभी मान्य पैरामीटर मान भी प्राप्त करें, महत्वपूर्ण रूप से, फ़ंक्शन और आगे का संदर्भ प्राप्त करें जिसमें फ़िल्टर / कार्रवाई का उपयोग किया जाता है


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

1
@MarkKaplun यह सिर्फ कुछ है जो मैंने जल्दी से :-) पर काम किया। ऊपर दिए गए फ़ंक्शंस कम से कम आपको बताते हैं कि फ़िल्टर और क्रियाएं विशिष्ट प्लगइन / थीम / कोर निर्देशिकाओं में कहां हैं। स्रोत पर वापस जाने के लिए यह अभी भी बहुत महत्वपूर्ण है और सुनिश्चित करें कि आप समझते हैं कि एक विशिष्ट फ़िल्टर विशेष रूप से क्या करता है। कुछ प्लग और विषयों खराब, प्रलेखित रहे हैं ताकि आप अभी भी ज्ञान और पृष्ठभूमि के कुछ प्रकार की आवश्यकता होगी पता है या क्या एक विशिष्ट फिल्टर एक विशेष समारोह में क्या बाहर ;-) आंकड़ा करने के लिए
पीटर गूसेन

@PieterGoosen हाँ मैं आमतौर पर स्रोत को देखने के लिए वापस कूदने के साथ ठीक हूं। अगर मैं पहली जगह में यह कर रहा हूँ इसका मतलब है कि प्लगइन हुक है, लेकिन जरूरी नहीं कि उनके लिए डॉक्टर ब्लॉक। लेकिन अगर मैं इस बात पर ध्यान देता हूं कि वे वास्तव में कहां उपयोग किए जाते हैं तो इससे मुझे समझ आता है कि क्या वे मूल्यवान हैं। वैसे भी ये ऐसे दिखते हैं जैसे वे महान हो सकते हैं। मैं उन्हें सिर्फ एक HTML फ़ाइल में लिखने के लिए 2 को भी संशोधित कर सकता हूं क्योंकि तब मैं सिर्फ स्थानीय सर्वर पर एक एमयू प्लगिन में फ़ंक्शन घोषणा को चिपका सकता था और इसे WP CLI से चला सकता था।
योनट्रॉन

@yonatron खुशी है कि मेरे दो सेंट किसी तरह से मदद करते हैं। यदि आप कभी भी मेरे कोड से अपना संशोधन लिखने आते हैं, तो आप हमेशा उत्तर के रूप में अपना कोड और स्पष्टीकरण जोड़ सकते हैं ( जो बहुत अच्छा होगा ) ;-) आनंद लें
Pieter Goosen

1
@PieterGoosen आपको इस स्क्रिप्ट को लिखने में और दस्तावेज़ को लिखने में कितना समय लगा, इसके भयानक ***** :)
Webloper

6

WP पार्सर की तरह लगता है कि आप क्या देख रहे हैं। इसका उपयोग आधिकारिक डेवलपर संदर्भ उत्पन्न करने के लिए किया जाता है । यह मापदंडों, @since टैग और स्रोत के संदर्भों को सूचीबद्ध करता है। यह सभी वर्डप्रेस प्लगइन्स के साथ काम करता है और इसे कमांड लाइन के माध्यम से एक्सेस किया जा सकता है:

wp parser create /path/to/source/code --user=<id|login>

1
मैं उस स्क्रिप्ट से बहुत परिचित नहीं हूं, लेकिन ऐसा लगता है कि इसे अच्छी तरह से प्रलेखित करने के लिए एक फिल्टर या कार्रवाई की आवश्यकता है। @Rarst ;-) से इस पर प्रतिक्रिया की सराहना करेंगे
पीटर

मैंने अभी तक इसकी कोशिश नहीं की है, लेकिन विवरण के आधार पर, मुझे लगता है कि पीटर की चिंता निशाने पर है। मैं सभी हुक ढूंढना चाहता हूं, न कि केवल अच्छी तरह से प्रारूपित डॉक्टर ब्लॉकों से पहले वाले। मुझे लगता है कि जो लोग वर्डप्रेस सम्मेलनों का उपयोग करके अपने हुक / कार्यों पर टिप्पणी करने के लिए समय लेते हैं, वे पहले से ही इस तरह की स्क्रिप्ट चला रहे हैं और अपने समर्थन साइटों पर एपीआई संदर्भ प्रकाशित कर रहे हैं। मुझे लगता है कि इसमें कुछ जोखिम निहित है, क्योंकि यदि कोई डेवलपर सार्वजनिक रूप से किसी फ़िल्टर का दस्तावेज़ नहीं देता है, तो यह बिना किसी चेतावनी के परिवर्तित / पदावनत हो सकता है, लेकिन मेरे द्वारा उपयोग किए जाने वाले कुछ प्लगइन्स के लिए, मैं डॉक्स को ऑनलाइन दिखाने के लिए प्रतीक्षा नहीं कर सकता।
योनट्रॉन

यह अनिर्धारित हुक भी बनाता है। उदाहरण: developer.wordpress.org/reference/hooks/graceful_fail
Jan Beck

4

फास्ट और फ्युरियस

अच्छा ol ' *nixकमांड-लाइन हमेशा काम आता है:

# grep  --line-number                                         \
        --exclude-dir=/path/to/some/directory                 \
        --include=*.php                                       \ 
        --recursive                                           \
        "add_filter\|do_action\|apply_filters"                \
        /path/to/wp-content/plugins/some-plugin               \ 
 | less

के माध्यम से कई और विकल्प #man grep

तब हम एक साधारण बैश स्क्रिप्ट भी बना सकते हैं wp-search.sh:

#!/bash/bin
grep --line-number                            \
    --exclude-dir=/path/to/some/directory     \
    --include=*.$1                            \
    --recursive $2 $3

और इसे साथ चलाएं।

 # bash wp-search.sh php "add_filter\|do_action\|apply_filters" /path/to/some-plugin

सुंदर उत्पादन

हम --colorआउटपुट का रंग बदलने के लिए विशेषता का उपयोग कर सकते हैं grep, लेकिन ध्यान दें कि यह साथ काम नहीं करेगा less

एक अन्य विकल्प यह होगा कि खोज परिणामों के लिए एक HTML तालिका बनाई जाए।

यहाँ awkमैंने एक उदाहरण का निर्माण किया है जो खोज परिणामों को HTML तालिका के रूप में results.htmlफ़ाइल में आउटपुट करता है :

  | sed 's/:/: /2' \
  | awk ' \
        BEGIN { \
            print "<table><tr><th>Results</th><th>Location</th></tr>"  \
        } \
        { \
            $1=$1; location=$1; $1=""; print "<tr><td>" $0 "</td><td>" location "</td><tr>" \
        } \
        END {  \
           print "</table>" \
       }' \
 > results.html

जहाँ मैंने इस ट्रिक का उपयोग सभी प्रमुख श्वेत स्थान को हटाने के लिए किया था और यह सभी क्षेत्रों को प्रिंट करने के लिए था, लेकिन पहला था।

मैं sedयहाँ दूसरे कोलन ( :) के बाद अतिरिक्त स्थान जोड़ने के लिए उपयोग करता हूँ , बस अगर वहाँ कोई स्थान नहीं है।

लिपि

हम इसे अपनी wp-search.shस्क्रिप्ट में जोड़ सकते हैं :

#!/bash/bin
grep   --with-filename \
       --line-number \
       --exclude-dir=/path/to/some/directory \
       --include=*.$1 \
       --recursive $2 $3 \
| sed 's/:/: /2' \
| awk ' BEGIN { \
        print "<table><tr><th>Results</th><th>Location</th></tr>"  \
    } \
    { \
        $1=$1; location=$1; $1=""; print "<tr><td>" $0 "</td><td>" location "</td><tr>" \
    } \
    END {  \
        print "</table>" \
    }' \
> /path/to/results.html

आप समायोजित करना जहां /path/to/some/directoryऔर /path/to/results.htmlअपनी आवश्यकताओं के।

उदाहरण - प्लगइन खोजना

यदि हम wordpress-importerप्लगइन के साथ इस पर कोशिश करते हैं:

bash wp-search.sh php "add_filter\|do_action" /path/to/wp-content/plugins/wordpress-importer/

तब results.htmlफ़ाइल इस प्रकार प्रदर्शित होगी:

परिणाम

उदाहरण - कोर की खोज

मैंने इसे कोर के लिए समय पर परीक्षण किया:

time bash wp-search.sh php "add_filter\|do_action" /path/to/wordpress/core/

real    0m0.083s
user    0m0.067s
sys     0m0.017s

और यह तेज़ है!

टिप्पणियाँ

अतिरिक्त संदर्भ प्राप्त करने के लिए हम -C NUMBERgrep का उपयोग कर सकते हैं ।

हम विभिन्न तरीकों से HTML आउटपुट को संशोधित कर सकते हैं, लेकिन उम्मीद है कि आप इसे अपनी आवश्यकताओं के अनुसार समायोजित कर सकते हैं।


धन्यवाद! मैं एक चुटकी में grep का उपयोग करता हूं, लेकिन मैं शेल सामान पर ऐसा नौसिखिया हूं कि मैंने कभी भी OR के लिए पाइप का उपयोग करने के लिए गोल नहीं किया। दूसरी बात जो मैं जोड़ना चाहूंगा, हालांकि यह थोड़ा बहुत छापने के विकल्प हैं। उपरोक्त grep लाइन का उत्पादन अभी भी स्किम के लिए काफी कठिन है।
योनट्रॉन

2
मैं बहुत प्रिंट @yonatron का एक उदाहरण के साथ जवाब अद्यतन
birgire
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.