Do_action और रिटर्न मान कैसे प्राप्त करें?


10

तो निम्नलिखित परिदृश्य है।

मैं डेटाबेस से लॉग को साफ करने के लिए एक क्रिया जोड़ता हूं:

add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

अब मैं इस क्रिया को समय-समय पर चलाना चाहता हूं:

wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );

और इसे मैन्युअल रूप से निष्पादित करें:

do_action( 'myplugin_clean_logs' );

विधि MyPlugin_Logs::clean_logsप्रभावित पंक्तियों की गिनती लौटाती है या गलत अगर कुछ दूसरी दिशा में चला गया।

अब मैं उन पंक्तियों की संख्या प्रदर्शित करना चाहता हूं जिन्हें हटा दिया गया है। मैं कुछ इस तरह की कल्पना करेगा:

$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';

लेकिन जैसा कि do_actionकोई मूल्य नहीं लौटाएगा, मुझे नहीं पता कि वापसी मूल्य कैसे प्राप्त करें।

क्या मुझे मैन्युअल रन पर सीधे विधि निष्पादित करनी चाहिए, लेकिन शेड्यूल ईवेंट पर कार्रवाई का उपयोग करें?


1
आप किसी निर्धारित घटना पर कुछ भी गूँजना नहीं चाहते हैं, इसलिए हाँ, मैं सीधे मैन्युअल रन पर विधि निष्पादित करूँगा (मुझे लगता है कि व्यवस्थापक इसे ट्रिगर करेगा, और आप उन्हें आउटपुट दिखाना चाहते हैं)।
टिम मेलोन

जवाबों:


13

शांत चीज एक फिल्टर है जो एक कार्रवाई के समान है, केवल यह एक मूल्य लौटाता है, इसलिए इसे केवल एक फिल्टर के रूप में सेट करें:

add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

फिर कुछ इस तरह:

$affected_rows = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );

पास करना चाहिए $affected_rowsकरने के लिए clean_logs()(और जो कुछ अन्य कार्यों आप के शौकीन हो सकता है myplugin_clean_logs) और करने के लिए दिया गया मान वापस आवंटित $affected_rows


4
डाउनवोट किया गया क्योंकि यह सॉफ्टवेयर विकसित करने के बजाय हैकिंग कोड है। अगर कार्रवाई सिर्फ फ़िल्टर का एक सबसेट होती तो उनकी कोई ज़रूरत नहीं होती। क्रॉन वैल्यू पास नहीं कर सकता है, इसे फिल्टर के रूप में हुक नहीं किया जाना चाहिए, भले ही बग्गी कोर कोड आपको इस तरह के किन्नर करने की अनुमति देता है :)
मार्क

1
मुद्दा लेना। मुझे लगता है कि दो अलग-अलग चीजों के इरादे से, लेकिन यहाँ मुख्य कोड को देखने के लिए, पूरी do_action()बात apply_filters():) के विस्तृत हैक से ज्यादा कुछ नहीं है
कैस्पर

कोर में एकमात्र खराब डिज़ाइन नहीं है, जो भाग में भ्रम पैदा करता है जो इस तरह के सवालों को जन्म देता है
मार्क कप्लून

1
हमें जो कुछ मिला है, उसके साथ काम करने की आवश्यकता है, इसलिए जब मैं मार्क की बात को समझता हूं तो मुझे लगता है कि यह अभी भी एक कानूनी जवाब है - जब तक कि भविष्य में कोर इस दृष्टिकोण को नहीं बदलता है, लेकिन मुझे लगता है कि बड़े पैमाने पर पीछे की संगतता समस्याओं के कारण संभावना नहीं है यह शुरू होगा।
टिम मेलोन

3
धन्यवाद, @TimMalone मैं @ चिह्न-कपल की आपत्ति की सराहना करता हूं। मेरा उत्तर बताता है कि कैसे do_action()एक do_action()इरादे के साथ काम करने के बजाय चारों ओर काम करना है कि कैसे अभिप्राय के साथ अनुरूपता में समाधान तैयार किया जाए । यदि कोई ऐसा करने में सक्षम है जो वह पूछ रहा है, तो वह उत्तर स्वीकृत उत्तर देने के योग्य है। मेरा पहला विचार था कि हुक विधि (ओपी इस प्लगइन के लिए एक ओओपी डिजाइन का उपयोग कर रहा है) को छोड़ दें, यह प्लगइन वर्ग की संरक्षित संपत्ति में परिणाम है और फिर इसे बाद में कुछ बिंदु पर खींचने के लिए एक त्वरित गेटर लिखें। लेकिन यह सिर्फ एक विचार का एक जंगली बाल है!
कैस्पर

-1

इस फ़ंक्शन का उपयोग कभी नहीं किया और यह परीक्षण नहीं किया है, लेकिन क्या यह काम कर सकता है? do_action_ref_array ()

function myplugin_clean_logs_fn() {
    $args = array(
        'param1'        => 'val1',
        'param2'        => 'val2',
        'affected_rows' => 0,
    );
    do_action_ref_array( 'myplugin_clean_logs', &$args );
    return $args['affected_rows'];
}

// CALL IT
$affected_rows = my_plugin_clean_logs();
echo $affected_rows .' entr'. ($args['affected_rows']*1===1?'y':'ies') .' deleted.';

// SCHEDULE IT
add_action('myplugin_clean_logs_call_fn', 'myplugin_clean_logs_fn');
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs_call_fn' );

// A SAMPLE FILTER
add_action('myplugin_clean_logs', function($args) {
    // Cleaning process
    // For each log affected, increment $args['affected_rows'] accordingly
}, 10, 3);

यदि वह काम नहीं करता है, तो कास्पर जैसी सुझाई गई चीज़ को फ़िल्टर क्यों नहीं करना चाहिए? मेरा मतलब है, कि एक फिल्टर का उद्देश्य है, और इस मामले में प्रभावित पंक्तियों की संख्या फ़िल्टर होने वाली चीज है। (मुझे पुरानी मोर्टकोर याद आती है। किसी को याद है कि यह केवल एक तीन पैरामीटर फ़ंक्शन के साथ रिटर्न वैल्यू, पास-बाय-रेफरेंस, और तर्क कैसे संभालती है?)


यह एक भयानक उत्तर है, जैसा कि संदर्भ द्वारा मानों को संशोधित करना और संशोधित करना वास्तव में बुरा व्यवहार है। ईमानदारी से, यह उत्तर वास्तव में प्रश्न के संदर्भ में मूल्य प्रदान नहीं करता है और इसे हटा दिया जाना चाहिए या टिप्पणी में बदल दिया जाना चाहिए। इसके अतिरिक्त, हुक के साथ अनाम कार्यों का उपयोग करना भी बुरा अभ्यास है, क्योंकि इससे उन्हें अनहुक करना असंभव हो जाता है।
हाइब्रिड वेब देव

मैं उपरोक्त वर्णित कारणों के लिए सहमत हूं, कि यह अनुशंसित पथ नहीं है। यदि आप किसी कारण से किसी एक्शन से रिटर्न वैल्यू प्राप्त करना चाहते हैं, और किसी त्वरित और गंदे की आवश्यकता है, तो मैं कैस्पर समाधान को प्राथमिकता दूंगा। यदि आप इसके आगे जीवन-चक्र के साथ कुछ विकसित कर रहे हैं, तो मैं अधिक मजबूत तरीके की तलाश करूंगा। आने के बारे में सोच, कैसे व्यवस्थापक नोटिस के बारे में? developer.wordpress.org/reference/hooks/admin_notices
jgangso
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.