फ़िल्टर के अंदर शोर्टकोड मान कैसे प्राप्त करें?


9

मैं एक फ़ंक्शन के अंदर एक शोर्ट का इनपुट मूल्य प्राप्त करने की कोशिश कर रहा हूं जो एक फिल्टर द्वारा उपयोग किया जाता है, लेकिन कोई सफलता नहीं लगती है। मैंने जो किया था यह रहा:

function my_shortcode_function($atts){
    $value = $atts['id'];
    function filter_value(){
        echo $value;
    }
    add_filter('posts_where','filter_value');
}
add_shortcode('my-shortcode','my_shortcode_function');

अब मुझे पता है कि वेरिएबल स्कोप्स के कारण $valueअंदर का उपयोग filter_value()नहीं होगा, लेकिन यहां तक ​​कि उपयोग करना भी $GLOBALS['value']काम नहीं करता है।

मैं भी $value = $atts['id']अंदर का उपयोग करने की कोशिश की , filter_value();लेकिन कोई सफलता भी नहीं।

मैं अपने शॉर्टकोड का उपयोग कैसे कर सकता हूं [my-shortcode id='123']और फ़िल्टर के लिए 123 मान पास कर सकता हूं ?

धन्यवाद।

जवाबों:


7

एक वैश्विक चर का उपयोग करने से काम होगा। यहाँ एक प्रदर्शन है:

function wpse_shortcode_function( $atts ){
    // User provided values are stored in $atts.
    // Default values are passed to shortcode_atts() below.
    // Merged values are stored in the $a array.
    $a = shortcode_atts( [
                'id'   => false,
    ], $atts );

    // Set global variable $value using value of shortcode's id attribute.
    $GLOBALS['value'] = $a['id'];

    // Add our filter and do a query.
    add_filter( 'posts_where', 'wpse_filter_value' );

    $my_query = new WP_Query( [
        'p' => $GLOBALS['value'],
    ] );

    if ( $my_query->have_posts() ) {
        while ( $my_query->have_posts() ) {
            $my_query->the_post();
            the_title( '<h1>', '</h1>');
        }
        wp_reset_postdata();
    }

    // Disable the filter.
    remove_filter( 'posts_where', 'wpse_filter_value' );
}
add_shortcode( 'my-shortcode', 'wpse_shortcode_function' );

function wpse_filter_value( $where ){
    // $GLOBALS['value'] is accessible here.

    // exit ( print_r( $GLOBALS['value'] ) );

    return $where;
}

साइड नोट, दूसरे फ़ंक्शन के भीतर फ़ंक्शन की घोषणा करना एक अच्छा अभ्यास नहीं है


यह वास्तव में अजीब है। यदि मैं उपयोग करने वाले मान को सेट करता हूं $GLOBALS['value'] = some valueऔर फिर कॉल करता है $GLOBALS['value']तो यह काम करता है, लेकिन अगर मैं मान को सीधे सेट करता हूं $value = some valueऔर फिर इसका उपयोग करके कॉल $GLOBALS['value']करता हूं तो यह काम नहीं करता है, जबकि इसे PHP मैनुअल के अनुसार काम करना चाहिए।
जैक जोहानसन

मान के साथ इसे प्रारंभ करने से पहले आपको $valueवैश्विक दायरे में सेट करना होगा global $value;। उदाहरण के लिए, global $value; $value = $a['id']; फिर फ़िल्टर में आप global $value; echo $value;वह मदद कर सकते हैं?
डेव रोमसे

हाँ धन्यवाद। मैं पढ़ रहा था इस पुस्तिका पर, और पहले उदाहरण में मान सीधे परिभाषित कर रहे हैं। क्या मुझे किसी भी फ़ंक्शन के बाहर उन्हें सीधे उपयोग करने के लिए उपलब्ध होना चाहिए $GLOBALS['value'];?
जैक जोहानसन

2
ठंडा। हमें खुशी हुई। उन डॉक्स से पहले उदाहरण में, चर एक फ़ंक्शन के बाहर और वैश्विक दायरे के भीतर घोषित किए जाते हैं। तो, कोई globalकीवर्ड की जरूरत नहीं है। हमारे उदाहरणों में, हम कार्यों के दायरे में काम कर रहे हैं, इसलिए globalकीवर्ड आवश्यक है।
डेव रोमसे

1
फिल्टर हमारे दोस्त हैं! :-) मुझे यकीन है कि कुछ उत्सुक उत्तरदाता आपके प्रश्नों का उत्तर देने के लिए आस-पास होंगे यदि आपको अधिक सहायता की आवश्यकता हो!
डेव रोमसे

7

यहाँ कुछ काम कर रहे हैं:

दृष्टिकोण # १

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

दृष्टिकोण # 2

एक और तरीका यह होगा कि आप WP_Queryअपने शोर्ट के कॉलबैक में इनपुट के रूप में वैल्यू पास करें :

$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );

और फिर अपने पोस्ट_विशेष फिल्टर के भीतर आप इसे एक्सेस कर सकते हैं:

add_filter( 'posts_where', function( $where, \WP_Query $query )
{

    if( $value = $query->get( 'wpse_value' ) )
    {
        // can use $value here
    }

    return $where;

}, 10, 2 );

दृष्टिकोण # 3

... या आप @the_dramatist द्वारा उदाहरण को समायोजित करने में सक्षम हो सकते हैं ताकि बाद में अनाम फ़ंक्शन को किसी चर में असाइन करके कॉलबैक को हटा सकें:

function my_shortcode_function( $atts, $content )
{
    // shortcode_atts stuff here

    $value = 5; // just an example  

    // Add a filter's callback
    add_filter( 'posts_where',  $callback = function( $where ) use ( $value ) {
        // $value accessible here
        return $where;
    } );

    // WP_Query stuff here and setup $out

    // Remove the filter's callback
    remove_filter( 'posts_where', $callback );

    return $out;
}

add_shortcode( 'my-shortcode', 'my_shortcode_function' );   

एक अनाम फ़ंक्शन को असाइन करने के तरीके पर PHP डॉक्स जैसे चेक करें , उपयोग कीवर्ड के साथ, एक चर पर।

ps: मुझे लगता है कि मैंने पहली बार इस वैरिएबल असाइनिंग ट्रिक के बारे में @gmazzap से सीखा, जिससे एक अनाम फ़िल्टर का कॉलबैक निकालना आसान हो सके।

आशा है ये मदद करेगा!


हमेशा की तरह, धन्यवाद, सटीक और सटीक जवाब। क्या आप एक वैश्विक अद्वितीय चर का उपयोग करके एक फ़ंक्शन के अंदर एक फ़ंक्शन को परिभाषित करने की सलाह देते हैं? यदि हाँ, तो क्या आप मुझे बता सकते हैं कि क्यों?
जैक जोहानसन

यह एक अच्छा विचार नहीं होगा, अगर हमें उस फ़ंक्शन का पुन: उपयोग करने की आवश्यकता है और यह किसी अन्य फ़ंक्शन के दायरे में अटक गया है और अन्य डेवलपर्स के लिए यह कठिन होगा जैसे कि गुमनाम कॉलबैक के साथ फ़िल्टर को छोड़ दें। तो wp.org रेपो के लिए एक औपचारिक प्लगइन के रूप में, मैं सबसे अधिक संभावना है कि अन्य डेवलपर्स को फिल्टर को यथासंभव आसान हटाने की अनुमति देने की कोशिश करूंगा;; दृष्टिकोण। यदि हम अपनी प्लगइन संरचना के साथ एक कोने में
पहुंचते हैं

मुझे लगता है कि मैं आपके तीसरे दृष्टिकोण के साथ जा रहा हूं। मेरे मामले में काम करने लगता है। चीयर्स!
जैक जोहानसन

यकीन है कि जो कुछ भी आप के लिए सबसे अच्छा काम करता है। मैं आसानी से इसे फिर से निकालने के लिए # 1 या # 2 के साथ बिना किसी फंक्शन के जा सकता हूं ;-) @JackJohansson
birgire

2
हम वास्तव में WP_Queryदिए गए उदाहरण को लक्षित करने के लिए कस्टम तर्कों और उनके मूल्यों पर गुजर सकते हैं और इसे विभिन्न फिल्टर जैसे posts_where, pre_get_postsऔर के माध्यम से एक्सेस कर सकते हैं posts_clauses। यही हम दृष्टिकोण # 2 में करते हैं।
बीरगीर

4

आप PHP के useकीवर्ड का उपयोग कर सकते हैं । तो इस कीवर्ड की मदद से आप किसी फंक्शन के अंदर वैरिएबल ला सकते हैं। और आप कोड को कम करने के लिए अनाम फ़ंक्शन भी लिख सकते हैं। तो पूरी बात होगी-use

/**
 * How to get shorcode's input values inside a filter?
 *
 * @param $atts
 */
function my_shortcode_function($atts){
    $value = $atts['id'];
    add_filter('posts_where',function() use ( $value ){
        echo $value;
    });

}
add_shortcode('my-shortcode','my_shortcode_function');

उम्मीद है की वो मदद करदे।


यह शांत है, लेकिन अनाम कार्यों को अनहुक करना मुश्किल है।
डेव रोमसे

2
ओह, अनाम फ़ंक्शन को हटाकर अब प्रश्न के दूसरे उत्तर में @birgire द्वारा कवर किया गया है। ठंडा!
डेव रोमसे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.