init फ़िल्टर या एक्शन में $ पोस्ट प्राप्त करें?


12

ऐसा लगता है कि $ पोस्ट केवल निश्चित समय पर निष्पादित करने के लिए उपलब्ध है। मेरे पास "init" हुक है जिसे $ पोस्ट- ID का उपयोग करके डेटाबेस से कुछ डेटा खींचने की आवश्यकता है।

अब तक मेरा एकमात्र काम The_content पर एक और फिल्टर जोड़ने का रहा है, जो मुझे आवश्यक जानकारी प्राप्त करने के लिए $ पोस्ट का उपयोग करता है। दुर्भाग्य से, यह स्क्रीन पर वापसी मूल्य को भी ग्रहण करता है, और वास्तव में इसे उस फ़ंक्शन पर वापस करने में विफल रहता है जिसे मूल रूप से फ़िल्टर कहा जाता है।

यहां वह कोड है जो मुझे आवश्यक डेटा निकालता है, लेकिन प्रतिध्वनित होता है और मूल्य वापस करने में विफल रहता है:

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

क्या किसी को कोई सुझाव है कि मुझे क्या चाहिए और इसे बाद में प्लगइन में उपयोग करने के लिए कॉलिंग फ़ंक्शन को कैसे पास करना है?

संपादित करें: संभवतः इसे और अधिक स्पष्ट करने के लिए, मेरे पास init पर चलने वाला एक फ़िल्टर है, जिसे DB से वर्तमान पोस्ट पर जानकारी प्राप्त करने में सक्षम होने की आवश्यकता है। ऐसा करने के लिए, इसे $ post-> ID तक पहुंच की आवश्यकता होती है। लेकिन यह init के भीतर संभव नहीं है, इसलिए मुझे उस परिणाम की आवश्यकता कैसे हो सकती है?

धन्यवाद,

जोनाथन

हल किया:

इस तरह से url_to_postid का उपयोग करने के लिए बस जवाब दिया गया था:

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

Init से भी पूरी तरह से काम करता है।


1
आपको एक्शन हुक की आवश्यकता है, न कि फ़िल्टर हुक की, यह initभी global $post;गुंजाइश के लिए बहुत जल्दी है । हो सकता है कि यदि आप वर्णन करते हैं कि आप जो पूरा करने की कोशिश कर रहे हैं वह बेहतर मदद करेगा।
बैनटेनट जूल

कार्रवाई हुक बिल्कुल उसी तरह से व्यवहार करता है, मैंने दोनों की कोशिश की है। मुझे पता है कि init बहुत जल्दी है, मैं यह जानने की कोशिश कर रहा हूं कि मुझे जिस परिणाम की आवश्यकता है उसे कैसे पूरा किया जाए - जो कि DB से जानकारी प्राप्त करने वाले init पर चलने वाला फ़िल्टर है जिसे पुनः प्राप्त करने के लिए $ पोस्ट-आईडी की आवश्यकता होती है।
जोनाथन

क्या आपको वास्तव में इनिट पर ऐसा करने की आवश्यकता है? बाद में हुक क्यों नहीं?
19st में Rarst

मुझे पृष्ठ के लिए डिफ़ॉल्ट कीवर्ड को पुनः प्राप्त करना होगा, अगर पहले से ही URL में कोई भी प्रदान नहीं किया गया है। उस कीवर्ड को DB में संग्रहीत किया जाता है, और बाकी स्क्रिप्ट निष्पादित होने से पहले उसे जाना जाना चाहिए। जैसा कि आप मेरे द्वारा प्रदान किए गए नमूने में देख सकते हैं, मैं केवल उस मूल्य को प्राप्त करने में सक्षम हूं जिसे मुझे the_content की आवश्यकता है, लेकिन फिर यह स्क्रीन को गूँजता है और कॉलिंग फ़ंक्शन को बिल्कुल भी वापस नहीं करता है। यदि आपके पास एक और उपाय है, तो कृपया इसका सुझाव दें।
जोनाथन

कृपया अपने उत्तर को हल करने के लिए, थान साइट के यांत्रिकी के अनुरूप अधिक होगा। इसके अलावा शीर्षक में हल करने की आवश्यकता नहीं है - आप उत्तर को स्वीकार करने में सक्षम होंगे और आपके प्रश्न को उत्तर के रूप में चिह्नित किया जाएगा।
रार्स्ट जूल

जवाबों:



2

यह भी वर्डप्रेस 4.7 में काम करता है:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

स्वीकृत उत्तर का उपयोग करने में समस्याएं थीं क्योंकि यह बंदरगाहों और मल्टीसाइट बंदरगाहों के साथ काम नहीं करता है । यहाँ एक समाधान है जो हर मामले में काम करना चाहिए:

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.