कैसे फ़िल्टर / अधिनियम के लिए बाहरी चर पास करने के लिए


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

गंदा? शायद। सरल? हाँ! इस तकनीक के लिए किसी भी downsides? कृपया चर्चा करें।

अद्यतन यहाँ प्रश्न में पूरा कोड है -> http://pastebin.com/fkSXY04m


बस उस फ़ंक्शन के अंदर अपनी "पागल गणना" करें ...
onetrickpony

मेरे सरलीकृत उदाहरण से इसे समझना शायद कठिन है। $ स्कोर चर का उपयोग उस टेम्पलेट में किया जाता है। मैं इसे एक बार गणना करना चाहता हूं और उस मान को फ़ंक्शन में पास करना चाहता हूं जो पेज शीर्षक बदलने के लिए एक फिल्टर के लिए कॉलबैक है। इस फ़िल्टर का उपयोग ऑल इन वन एसईओ पैक में किया जाता है। गणना को कई बार चलाना वांछित नहीं है।
किंगकोल 6868

तब आपको अधिक कोड पोस्ट करना चाहिए यदि आप एक समाधान प्राप्त करना चाहते हैं जिसमें वैश्विक स्थिति को शामिल करना शामिल नहीं है (जिसकी कभी आवश्यकता नहीं होनी चाहिए)।
onetrickpony

यहाँ एक टेम्पलेट फ़ाइल में पूरा कोड है। $scoreचीजों की एक सरणी पर पाशन और एक चर बढ़ाने के द्वारा गणना की जाती है। pastebin.com/fkSXY04m
Kingkool68

जवाबों:


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


इस का कोई लेना-देना नहीं है कि function_filters द्वारा फ़ंक्शन को दिए गए तर्कों की संख्या ...
onetrickpony

कोशिश की गई विधि # 1 आप चर का वैश्वीकरण करने का उल्लेख करते हैं। यह काम नहीं करता है। स्वीकृत आर्ग्स पैरामेटर मेरी मदद नहीं करता है क्योंकि कॉलबैक फ़ंक्शन के लिए चर क्या हैं, इस पर मेरा कोई नियंत्रण नहीं है।
राजाकुली

क्षमा करें आप सही थे। मैंने $scoreपहले गणना की और फिर इसे वैश्वीकरण किया। कोई आश्चर्य नहीं कि यह काम नहीं कर रहा था। धन्यवाद!
राजकुल king६ king

-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()
चिप बेनेट

आपका मतलब है remove_filter, जो मुख्य रूप से बिल्ट-इन फिल्टर्स को हटाने के लिए उपयोग किया जाता है, प्लगइन्स / थीम द्वारा जोड़े गए फिल्टरों में नहीं ...
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

एक बार "वैश्विक" की कम घोषणा। उनके दूसरे उदाहरण को देखें, तो उन्होंने दो बार ग्लोबली $ wp की घोषणा की!
एडम

यह भी काम नहीं करता है। यह पहली चीज है जो मैंने कोशिश की।
राजाकुल

आप करने में सक्षम हैं printया echoअपने परिणाम सुनिश्चित करें कि आपके समारोह वास्तव में यह फिल्टर करने के लिए पारित करने से पहले काम कर रहा है?
एडम

ऊप्स! वैश्वीकरण $scoreवास्तव में काम करता है। मैंने नासमझ और $scoreपहले सेट किया फिर वैश्वीकरण किया जो स्पष्ट रूप से काम नहीं करता है। $scoreपहले इसे वैश्वीकरण के द्वारा उचित तरीके से करना और फिर इसे वैसा ही करना जैसा कि अपेक्षित है। सबको शुक्रीया।
राजकुल king६ king
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.