সুপ্ত হুক রেফারেন্স তৈরি করুন


10

মনে হচ্ছে অনেকগুলি প্লাগইন বিকাশকারী ফিল্টার / অ্যাকশন হুক যুক্ত করতে সময় নেয় যাতে ব্যবহারকারীরা তাদের পণ্যগুলির কার্যকারিতাটি ঝাঁকিয়ে যায়। কোনটি দুর্দান্ত, তবে তারা প্রায়শই যা করেন না তা হুকের তালিকা সরবরাহ করে এবং তারা কত যুক্তি নিয়ে থাকে।

প্লাগইন (বা থিম) ডিরেক্টরিতে নির্দেশিত এবং সমস্ত উপলব্ধ হুকের একটি তালিকা দেখার জন্য কি কেউ সেরা স্বয়ংক্রিয় উপায় খুঁজে পেয়েছে?

আমি এমন কিছু প্লাগইন দেখেছি যা হুকগুলির জন্য স্ক্যান করে, তবে যতদূর আমি বলতে পারি, তারা আপনাকে দেখায় যে প্রদত্ত পৃষ্ঠাটি রেন্ডার করতে আসলে কোনটি আসলে বলা হচ্ছে। যা পাই তা কাজে লাগতে পারে। তবে কখনও কখনও যদি আমি জানতে পারি যে আমি একটি নির্দিষ্ট প্লাগইনটির সাথে ইন্টারেক্ট করছি, তবে আমি প্রতিটি জায়গা জানতে চাই এটি হয়ত আমাকে কোনও ক্রিয়া বা ফিল্টার আঁকতে পারে।

সুতরাং আমি যা সত্যিই সন্ধান করছি এটি এমন একটি যা একটি প্লাগইন রুট ডিরেক্টরি দেওয়া থাকলে একটি তালিকা তৈরি হবে যেখানে প্রতিটি আইটেম অন্তর্ভুক্ত থাকে:

  • ট্যাগ
  • প্রকার (ক্রিয়া বা ফিল্টার)
  • যুক্তি সংখ্যা
  • যেখানে এটি উত্স (মাধ্যমে do_action()বা apply_filter()) বলা হয়

একটি স্ক্রিপ্ট দুর্দান্ত হবে যেহেতু এটি সম্ভবত পুরো জিনিসটি HTML টি চমত্কারভাবে তৈরি করতে পারে এবং প্রতিটি প্লাগইনের জন্য অ্যাডমিন ইউআইতে আমাকে এটি প্রদর্শন করতে পারে। এমনকি একটি কমান্ড-লাইনের স্ক্রিপ্ট যা কার্যকর স্ট্যাটিক ফাইলকে আউটপুট দেয় দুর্দান্ত হবে।


তাহলে প্রশ্ন কি? আপনি যদি কোনও প্লাগইন সুপারিশ সন্ধান করেন তবে এটি এখানে অফ-টপিক
মার্ক কপলুন

দুঃখিত, ওয়ার্ডপ্রেস বিকাশ মেটা আগাছা খুব বেশি পেতে চান না , কিন্তু ক) আমি এখানে নতুন তাই আমি বুঝতে পারি নি যে প্লাগইন সুপারিশ চাইলে ওটি ছিল were সে সম্পর্কে আমার কিছু মতামত থাকতে পারে ... তবে এখনও, আমার এটি প্রথমে উপলব্ধি করা উচিত ছিল। খ) ওফ, আমি কেবলমাত্র আমার প্লাগইন বা শেল স্ক্রিপ্ট, বা স্ক্র্যাচ থেকে কিছু আছে কিনা, আমার প্রশ্নের সমাধানের সন্ধান করার চেষ্টা করছি। সুতরাং প্রশ্নটি কঠোরভাবে একটি প্লাগইন সুপারিশ অনুরোধ!
ইয়োনাট্রন

ঠিক আছে, মনে হচ্ছে অন্য প্রত্যেকে মজা করছে তাই কোনও ক্ষতি হয়নি। প্রশ্নের আমার "আপত্তি" আসলে এটি একটি পাঠ্য পার্সিংয়ের প্রশ্ন সম্পর্কে আরও ছিল যা লোকদের জন্য আগ্রহী যে সংকলক শৈলীর সফ্টওয়্যার লিখতে পছন্দ করে তবে প্রকৃত ওয়ার্ডপ্রেস কোডিংয়ের সাথে খুব কমই থাকে। রেকর্ডের জন্য এমনকি ওয়ার্ডপ্রেস.আর.আর সম্পর্কিত প্রশ্নগুলি কীভাবে প্লাগইন জমা দিতে হয় তা সাধারণত অফ-টপিক হিসাবে ভোট দেওয়া হবে।
মার্ক কাপলুন

উত্তর:


6

আপনি যা চান তা করতে আমার জানা কোনও স্ক্রিপ্ট বা প্লাগইন নেই। আপনি যেমনটি বলেছেন, এখানে স্ক্রিপ্ট রয়েছে ( এমনকি বিশ্বব্যাপী ভেরিয়েবল ) যা আপনি বর্তমানে ফিল্টার এবং ক্রিয়াকলাপগুলি মুদ্রণ করতে ব্যবহার করতে পারেন।

সুপ্ত ফিল্টার এবং ক্রিয়া হিসাবে, আমি দুটি খুব বেসিক ফাংশন ( এখানে এবং সেখানে কিছু সহায়তার সাথে ) লিখেছি যা কোনও ফাইলে সমস্ত apply_filtersএবং do_actionদৃষ্টান্ত খুঁজে পায় এবং তারপরে এটি মুদ্রণ করে

বুনিয়াদি

  • আমরা ডিরেক্টরিতে সমস্ত পিএইচপি ফাইল পেতে RecursiveDirectoryIterator, RecursiveIteratorIteratorএবং RegexIteratorপিএইচপি ক্লাস ব্যবহার করব । উদাহরণস্বরূপ, আমার লোকালহোস্টে, আমি ব্যবহার করেছি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
আপনার অত্যধিক ফ্রি সময় আছে;) তবে শেষ পর্যন্ত ফিল্টারগুলি কী তা জানার আগেও যথেষ্ট নয় তবে প্রত্যাশিত প্যারামিটারের মানগুলি এবং ফলাফলগুলি কী এবং ডক ব্লকের ক্ষেত্রে ক্ষেত্রে ডাবল ব্ল্যাক পাওয়ার জন্য এটি উত্স থেকে অর্জন করা যায় না case মূল ফাইলগুলির এবং সম্ভবত কোনও নন কোর প্লাগইন এবং থিমগুলিতে পাওয়া যায় না।
মার্ক কপলুন

1
@ মার্কক্যাপলুন এটি কেবলমাত্র আমি :-) এ কাজ করেছি। উপরের ফাংশনগুলি আপনাকে অন্ততপক্ষে ফিল্টার এবং ক্রিয়া নির্দিষ্ট প্লাগইন / থিম / মূল ডিরেক্টরিতে কোথায় তা আপনাকে জানায়। উত্সটিতে ফিরে যাওয়া এবং একটি নির্দিষ্ট ফিল্টার বিশেষত কী করে তা আপনি বুঝতে পেরেছেন তা নিশ্চিত হওয়া এখনও গুরুত্বপূর্ণ। কিছু প্লাগইন এবং থিমগুলি দুর্বলভাবে নথিভুক্ত করা হয়, সুতরাং নির্দিষ্ট
ফাংশনটিতে

@ পিটারগুজেন হ্যাঁ উত্সটি দেখার জন্য আমি সাধারণত পিছনে ঝাঁপিয়ে পড়ে ঠিক আছি। যদি আমি এটি প্রথম স্থানে করছি তবে এর অর্থ প্লাগইনটিতে হুক রয়েছে তবে অগত্যা তাদের জন্য ডক ব্লক নয়। তবে আমি যদি সেগুলিকে প্রকৃতপক্ষে ব্যবহার করা হয় সেদিকে একবার নজর রাখি তবে সেগুলি মূল্যবান কিনা তা বুঝতে আমার সহায়তা করে। যাইহোক, এগুলি দেখতে দুর্দান্ত দেখাচ্ছে। আমি কেবলমাত্র একটি এইচটিএমএল ফাইল লিখতে তাদের ২ য় সংশোধন করতে পারি কারণ তখন আমি কেবলমাত্র স্থানীয় সার্ভারে একটি এমইউ প্লাগইনে ফাংশন ঘোষণাকে আটকে রাখতে পারি এবং ডাব্লুপি সিএলআই থেকে চালাতে পারি।
ইয়োনট্রন

@ ইয়োনাট্রন খুশী যে আমার দুটি সেন্ট কোনওভাবে সহায়তা করে। আপনি যদি আমার কোড থেকে নিজের পরিবর্তনটি লিখতে আসতে চান তবে আপনি সর্বদা উত্তর হিসাবে আপনার কোড এবং ব্যাখ্যা যুক্ত করতে পারেন ( যা দুর্দান্ত হবে ) ;-)। উপভোগ করুন
পিটার গুজন 14

1
@ পিটারগোজেন এই স্ক্রিপ্টটি লেখার পাশাপাশি ডকুমেন্ট করতে আপনি কতটা সময় নিয়েছিলেন, এটি দুর্দান্ত
esome

6

ডাব্লুপি পার্সারের মতো শব্দগুলি আপনি যা সন্ধান করছেন তা করে। এটি অফিসিয়াল বিকাশকারী রেফারেন্স উত্পন্ন করতে ব্যবহৃত হয় । এটি পরামিতি, @ সিং ট্যাগ এবং উত্সের রেফারেন্স তালিকাভুক্ত করে। এটি সমস্ত ওয়ার্ডপ্রেস প্লাগইনগুলির সাথে কাজ করে এবং কমান্ড লাইনের মাধ্যমে অ্যাক্সেস করা যায়:

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

1
আমি সেই স্ক্রিপ্টটির সাথে খুব বেশি পরিচিত নই, তবে মনে হয় ভাল ডকুমেন্ট করার জন্য এটির ফিল্টার বা ক্রিয়া দরকার। @Rarst ;-) থেকে এই সম্পর্কে প্রতিক্রিয়াটির প্রশংসা করি
পিটার

আমি এটি এখনও চেষ্টা করি নি, তবে বর্ণনার ভিত্তিতে আমার মনে হয় পিটারের উদ্বেগ লক্ষ্যবস্তু। আমি সমস্ত হুকগুলি সন্ধান করতে চাই, কেবল ভাল ফর্ম্যাটেড ডক ব্লকগুলির পূর্ববর্তী নয়। আমি মনে করি যে লোকেরা যারা ওয়ার্ডপ্রেস কনভেনশন ব্যবহার করে তাদের হুক / ফাংশনগুলি সম্পর্কে মন্তব্য করতে সময় নেয় তারা ইতিমধ্যে এই জাতীয় স্ক্রিপ্টটি চালাচ্ছে এবং তাদের সমর্থন সাইটগুলিতে এপিআই রেফারেন্স প্রকাশ করছে। আমি বুঝতে পারি এর মধ্যে কিছুটা ঝুঁকি অন্তর্নিহিত, যেহেতু কোনও বিকাশকারী যদি প্রকাশ্যে কোনও ফিল্টার নথিভুক্ত না করেন তবে এটি সতর্কতা ছাড়াই পরিবর্তন / অবমূল্যায়ন করতে পারে, তবে আমি যে কয়েকটি প্লাগইন ব্যবহার করি তার জন্য ডক্স অনলাইনে প্রদর্শিত হওয়ার অপেক্ষায় থাকতে পারি না।
ইয়োনট্রন

এটি অননুমোদিত হুকগুলিও পার্স করে। উদাহরণ: ডেভেলপার.ওয়ার্ডপ্রেস.আর.
জান বেক

4

দ্রুত এবং অগ্নিশর্মা

ভাল অল ' *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 টেবিল তৈরি করা হবে table

এখানে awkআমি তৈরি করেছি এমন একটি উদাহরণ যা অনুসন্ধানের ফলাফলগুলিকে এইচটিএমএল টেবিল হিসাবে 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 NUMBERগ্রেপ এর ব্যবহার করতে পারি ।

আমরা বিভিন্ন উপায়ে এইচটিএমএল আউটপুট পরিবর্তন করতে পারে, তবে আশা করি আপনি এটি আরও আপনার প্রয়োজনের সাথে সামঞ্জস্য করতে পারেন।


ধন্যবাদ! আমি একটি চিম্টিতে গ্রেপ ব্যবহার করি তবে আমি শেল স্টাফে এমন নবাগত যে আমি কখনও কখনও ওআর এর পাইপ ব্যবহার করতে পারি নি। আমি যুক্ত করতে চাইলে অন্যটি জিনিসটি বেশ কিছুটা মুদ্রণের বিকল্প রয়েছে। উপরের গ্রেপ লাইনের আউটপুটটি স্কিম করা এখনও বেশ কঠিন হতে চলেছে।
ইওনাট্রন

2
আমি উত্তরটি সুন্দরভাবে মুদ্রণের @yonatron এর উদাহরণ সহ আপডেট করেছি
বার্জায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.