কিভাবে একটি ফিল্টার মধ্যে শর্টকোড এর ইনপুট মান পেতে?


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']করে কল করি তবে এটি পিএইচপি ম্যানুয়াল অনুসারে কাজ করা উচিত।
জ্যাক জোহানসন

একটি মান দিয়ে আরম্ভ $valueকরার global $value;আগে আপনাকে বৈশ্বিক সুযোগে সেট করতে হবে। উদাহরণস্বরূপ global $value; $value = $a['id']; আপনি ফিল্টারটিতে global $value; echo $value;কি তা করতে পারেন?
ডেভ রোমসে

হ্যা ধন্যবাদ. আমি পড়া ছিল এই ম্যানুয়াল উপর, এবং প্রথম উদাহরণে মান সরাসরি সংজ্ঞায়িত করা হয়। সরাসরি ব্যবহারের জন্য উপলভ্য থাকতে কি আমার কোনও ফাংশনের বাইরে এগুলি সংজ্ঞায়িত করতে হবে $GLOBALS['value'];?
জ্যাক জোহানসন

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

1
ফিল্টারগুলি আমাদের বন্ধু! :-) আমি নিশ্চিত যে আরও উত্সাহী উত্তরদাতা আপনার প্রশ্নের উত্তর দিতে আপনার কাছাকাছি থাকবে যদি আপনার আরও সহায়তার প্রয়োজন হয়!
ডেভ রোমসে

7

এখানে কয়েকটি কর্মক্ষেত্র রয়েছে:

পন্থা # 1

ক্লাসের পদ্ধতিগুলির মধ্যে যেমন একটি ব্যক্তিগত ভেরিয়েবল হিসাবে কোনও প্রদত্ত মানকে পাশ 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

... অথবা আপনি ভেরিয়েবলের বেনামে ফাংশন নির্ধারণের পরে কলব্যাকটি মুছে ফেলতে সক্ষম করতে @ থে_ড্রেম্যাটিস্ট দ্বারা উদাহরণটিও সামঞ্জস্য করতে পারেন:

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

উদাহরণস্বরূপ, পিএইচপি ডক্স কীভাবে একটি ভেরিয়েবলের ব্যবহার কীওয়ার্ড সহ একটি বেনাম ফাংশন নির্ধারণ করতে হবে তা পরীক্ষা করুন ।

PS: আমি মনে করি বেনামে ফিল্টারটির কলব্যাক অপসারণ করা আরও সহজ করার জন্য, আমি প্রথমে @gmazap দ্বারা এই পরিবর্তনশীল নির্ধারণের কৌশল সম্পর্কে শিখেছি।

আশা করি এটা সাহায্য করবে!


ধন্যবাদ বার্জায়ার, যথারীতি সদা এবং যথাযথ উত্তর answer আপনি কি বিশ্বব্যাপী অনন্য চলকটি ব্যবহার করে কোনও ফাংশনের অভ্যন্তরে কোনও ফাংশন সংজ্ঞায়নের পরামর্শ দেন? যদি হ্যাঁ, তবে আমাকে বলতে পারেন কেন?
জ্যাক জোহানসন

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

আমার ধারণা আমি আপনার তৃতীয় পদ্ধতির সাথে যাচ্ছি আমার ক্ষেত্রে কাজ মনে হচ্ছে। চিয়ার্স!
জ্যাক জোহানসন

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

2
আমরা আসলে কাস্টম আর্গুমেন্ট এবং তাদের মান পাস করতে WP_Queryমতো বিভিন্ন ফিল্টারগুলির মাধ্যেমে একটি প্রদত্ত উদাহরণস্বরূপ এবং এটি অ্যাক্সেস লক্ষ্য posts_where, pre_get_postsএবং posts_clauses। এটি আমরা # 2 এর পদ্ধতির মধ্যে করি।
বার্জায়ার

4

আপনি পিএইচপি এর 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
ওহ, বেনামে ফাংশন সরিয়ে এখন প্রশ্নের উত্তরে @ বিবারগায়ার দ্বারা কভার করা হয়েছে। শান্ত!
ডেভ রোমসে

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