কীভাবে বাহ্যিক চলকগুলি ফিল্টার / ক্রিয়াকলাপে পাস করবেন


11

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

এই উদাহরণটি ধরুন:

$score = 42; //Some crazy calculation I don't want to repeat.

function add_score_to_title($title) {
    return 'Quiz Results (' . $score . '/') - ' . $title;
}

add_filter( 'aioseop_title_single', 'add_score_to_title');

আমি কিভাবে $scoreভেরিয়েবলটি পাস করতে পারি add_score_to_title()?

আমি যা করতে পেরেছি তা বৈশ্বিক $wpঅবজেক্টে আমার পরিবর্তনশীল যুক্ত হয়েছিল । সুতরাং আপনি এটি দিয়ে শেষ:

global $wp;
$score = 42; //Some crazy calculation I don't want to repeat.
$wp->some_random_name_for_score = $score;

function add_score_to_title($title) {
    global $wp;
    $score = $wp->some_random_name_for_score;
    return 'Quiz Results (' . $score . '/') - ' . $title;
}

add_filter( 'aioseop_title_single', 'add_score_to_title');

ডার্টি? হতে পারে. সরল? হা! এই কৌশলটি কোন ডাউনসাইড? দয়া করে আলোচনা করুন।

আপডেট আপডেটে এখানে সম্পূর্ণ কোডটি রয়েছে -> http://pastebin.com/fkSXY04m


কেবলমাত্র সেই ফাংশনের ভিতরে আপনার "পাগল গণনা" করুন ...
অনট্রিকপনি

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

তারপরে আপনি যদি এমন কোনও সমাধান পেতে চান যা বিশ্বব্যাপী রাষ্ট্রের (যা কখনই প্রয়োজন হয় না) জড়িত না এমন কোনও সমাধান পেতে চাইলে আপনার আরও কোড পোস্ট করা উচিত।
onetrickpony

এখানে একটি টেম্পলেট ফাইলের সম্পূর্ণ কোড is $scoreজিনিসগুলির অ্যারের উপরে লুপিং করে এবং একটি ভেরিয়েবল বৃদ্ধি করে গণনা করা হয়। পেস্টবিন.
com

উত্তর:


10

আপনার কাছে কমপক্ষে দুটি বিকল্প রয়েছে:

  1. কাঙ্ক্ষিত পরিবর্তনশীলকে বিশ্বায়ন করুন এবং তারপরে এটি কলব্যাকের অভ্যন্তরে উল্লেখ করুন
  2. একটি ফাংশন দিয়ে স্কোর গণনা যুক্তি মোড়ানো, তারপরে এটি কলব্যাকের অভ্যন্তরে উল্লেখ করুন

ভেরিয়েবলকে বিশ্বায়ন করুন

<?php
global $score;
$score = 42; //Some crazy calculation I don't want to repeat.

function add_score_to_title($title) {
    global $score;
    return 'Quiz Results (' . $score . '/') - ' . $title;
}

add_filter( 'aioseop_title_single', 'add_score_to_title');
?>

স্কোর গণনা মোড়ানো

আপনি শুধুমাত্র কি কখনো স্কোর হিসাব প্রয়োজন ভিতরে ফিল্টার, কলব্যাক নিজেই মধ্যে যুক্তিবিজ্ঞান টান:

<?php
function add_score_to_title($title) {
    $score = 0;
    $questions = get_quiz_result_questions();
    $total_questions = 0;
    foreach( $questions as $question ) {
        $order = $question->order;

        if( $order >= 100 ) {
            break;
    }

    if( $question->correct == $_POST['Q'][$order] ) {
        $score++;
    }
    $total_questions++;

    return 'Quiz Results (' . $score . '/') - ' . $title;
}

add_filter( 'aioseop_title_single', 'add_score_to_title');
?>

আরও ভাল, আপনি নিজের স্কোরের গণনাটি তার নিজের কোনও ফাংশনে গুটিয়ে রাখতে পারেন এবং তারপরে সেই ফাংশনটি আপনার কলব্যাকের ভিতরে কল করতে পারেন:

<?php
function wpse48677_get_score() {
    $score = 0;
    $questions = get_quiz_result_questions();
    $total_questions = 0;
    foreach( $questions as $question ) {
    $order = $question->order;

    if( $order >= 100 ) {
        break;
    }

    if( $question->correct == $_POST['Q'][$order] ) {
        $score++;
    }
    $total_questions++;
    $output['score'] = $score;
    $output['total_questions'] = $total_questions;

    return $output;
}

function add_score_to_title($title) {

    $score_results = wpse48677_get_score();

    $score = $score_results['score'];

    return 'Quiz Results (' . $score . '/') - ' . $title;
}

add_filter( 'aioseop_title_single', 'add_score_to_title');
?>

আপনি যদি $_POSTঅবজেক্টটি উল্লেখ করতে সমস্যা বোধ করেন তবে আপনি আপনার ক্যোয়ারী ভেরিয়েবলটিও নিবন্ধভুক্ত করতে পারেন এবং তারপরে get_query_var()ডেটা পেতে অভ্যন্তরীণভাবে ব্যবহার করতে পারেন:

function add_score_query_vars( $query_vars ) {
    $query_vars[] = 'Q';

    return $query_vars;
}
add_filter( 'query_vars', 'add_score_query_vars' );

এটি জায়গায়, এর $_POST['Q']সাথে প্রতিস্থাপন করা যেতে পারে get_query_var('Q')


প্রয়োগ_ ফিল্টার দ্বারা ফাংশনটিতে যতগুলি আর্গুমেন্ট পাস হয়েছে তার সাথে এর কোনও যোগসূত্র নেই ...
অনেট্রিকপনি

চেষ্টা করা পদ্ধতি # 1 আপনি ভেরিয়েবলকে বিশ্বায়নের উল্লেখ করেছেন। এটি কাজ করে না। কল্যাব ফাংশনে কোন ভেরিয়েবলগুলি পাস হবে তার উপর আমার কোনও নিয়ন্ত্রণ নেই বলেই গৃহীত আরগস প্যারামিটার আমাকে সাহায্য করে না।
কিংকুল 68

দুঃখিত আপনি ঠিক বলেছেন। আমি $scoreপ্রথমে গণনা করেছি এবং তারপরে এটি বিশ্বায়ন করেছিলাম। অবাক হওয়ার কিছু নেই যে এটি কাজ করে নি। ধন্যবাদ!
কিংকুল 68

-1। প্রথম বিকল্পটি গ্লোবাল স্টেটে একটি পরিবর্তনশীল প্রকাশ করে, ২ য় বিকল্প কার্যকর হয় না ...
onetrickpony

1
" গ্লোবাল কি মন্দ "? সত্যি ? তারপরে পুরো ওয়ার্ডপ্রেস কোডটি আরও ভাল লেখা ছিল, কারণ এটি বেশ কয়েকটি বিশ্বব্যাপী ভেরিয়েবলের উপর নির্ভর করে
চিপ বেনেট

3
function add_score_to_title($title = false) {
  static $score = false;

  if($score === false){
    // do calc
  }

  // plugin call (filter)   
  if($title !== false)
    return 'Quiz Results (' . $score . ') - ' . $title;

  // your call
  return $score;
}

স্কোর পেতে আপনার স্ক্রিপ্টের যে কোনও জায়গায় ফাংশনটি কল করুন, এটি কেবল একবার গণনা করা হবে।

বেনামে ফাংশন ব্যবহার করে অন্য উপায় :

// do the calc
$score = 'xxx';

add_filter('aioseop_title_single', function($title) use($score){
  return 'Quiz Results (' . $score . ') - ' . $title;  
});

3
বেনামে ফাংশনগুলি কল add_filter()বা add_action()কল করা উচিত নয় । সেগুলির মাধ্যমে সরানো যায় না remove_function()
চিপ বেনেট

আপনার অর্থ মুছে ফেলা ফিল্টার, যা মূলত অন্তর্নির্মিত ফিল্টারগুলি সরানোর জন্য ব্যবহৃত হয়, প্লাগইন / থিম দ্বারা যুক্ত ফিল্টারগুলি নয় ...
onetrickpony

1
হ্যাঁ; দুঃখিত: remove_filter()এবং remove_action()। এবং এর কোনও কারণ নেই যে প্লাগিন / থিম ফিল্টারগুলি যথাযথভাবে অপসারণ করা উচিত নয়: প্লাগিন স্টাইলশিট এনকুইগুলি, চাইল্ড থিমস ইত্যাদিকে ওভাররাইড করুন
চিপ বেনেট

0

নিম্নলিখিত উদাহরণটি $my_calculationবৈশ্বিক সুযোগে পরিবর্তনশীল দেখতে পায় , তবে আমাদের স্থানীয় ফাংশন থেকে global $my_calculationবৈশ্বিক সুযোগে পরিবর্তনশীল অ্যাক্সেস করার জন্য আমাদের ঘোষণা করতে হবে।

<?php 

    $my_calculation = 'result!';

    function my_function() {

        global $my_calculation;
        return $my_calculation;

    }

    add_filter( 'function_something_here', 'my_function');   

?>

এটি ঘুরে দেখার একমাত্র উপায় এবং এটি ঝরঝরে বলে মনে হয়। এটি কি আপনার জন্য কাজ করবে?


এটি ইতিমধ্যে যা আছে তার থেকে আলাদা কীভাবে?
onetrickpony

একবার "গ্লোবাল" কম ঘোষণার। তার দ্বিতীয় উদাহরণটি দেখুন, তিনি গ্লোবাল-ডাব্লুপিপি দু'বার ঘোষণা করলেন!
আদম

এটিও কাজ করে না। এটিই আমি প্রথম চেষ্টা করেছি।
কিংকুল 68

ফিল্টারটিতে যাওয়ার আগে আপনার ফাংশনটি সত্যই কাজ করছে তা নিশ্চিত করতে আপনি printবা echoআপনার ফলাফলটি সক্ষম ?
আদম

ওহো! বিশ্বায়ন $scoreআসলেই কাজ করে does আমি গোফড হয়ে $scoreপ্রথমে গ্লোবালাইজড সেট করেছিলাম যা পরিষ্কারভাবে কাজ করে না। প্রথমে বিশ্বায়নের মাধ্যমে যথাযথ উপায়ে এটি করার $scoreপরে প্রত্যাশার মতো একটি মান দিয়ে কাজ করে। সবাইকে ধন্যবাদ.
কিংকুল 68
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.