2009-04-21 13 views
40

वर्डप्रेस के पास सामग्री के विशिष्ट बिट्स के सभी प्रकारों को प्राप्त करने और आउटपुट से पहले इसे संशोधित करने के लिए बहुत अच्छा फ़िल्टर समर्थन है। "The_content" फ़िल्टर की तरह, जो आपको स्क्रीन पर आउटपुट से पहले किसी पोस्ट के लिए मार्कअप तक पहुंचने देता है।अंतिम एचटीएमएल आउटपुट को संशोधित करने के लिए वर्डप्रेस फ़िल्टर

मैं एक कैच-ऑल फ़िल्टर ढूंढने की कोशिश कर रहा हूं जो मुझे आउटपुट से पहले पूरी तरह से अंतिम मार्कअप को संशोधित करने में एक आखिरी दरार देता है। किसी को भी पता है?

मैं फ़िल्टर्स की सूची कई बार ब्राउज़ कर चुके हैं, लेकिन कुछ भी मुझ पर बाहर कूदता है: http://adambrown.info/p/wp_hooks/hook/filters

(मैं इस सवाल के लिए कुछ Wordpress विशिष्ट समुदायों उपयोग किया गया है, लेकिन एक भी प्राप्त किया नहीं जवाब, सोचा कि मैं आदरणीय SO पर बदल जाऊंगा।)

उत्तर

14

AFAIK, इसके लिए कोई हुक नहीं है, क्योंकि थीम HTML का उपयोग करती हैं जो वर्डप्रेस द्वारा संसाधित नहीं की जाएगी।

हालांकि, आप use output buffering अंतिम एचटीएमएल को पकड़ने के लिए कर सकते हैं:

<?php 
// example from php.net 
function callback($buffer) { 
    // replace all the apples with oranges 
    return (str_replace("apples", "oranges", $buffer)); 
} 
ob_start("callback"); 
?> 
<html><body> 
<p>It's like comparing apples to oranges.</p> 
</body></html> 
<?php ob_end_flush(); ?> 
/* output: 
    <html><body> 
    <p>It's like comparing oranges to oranges.</p> 
    </body></html> 
*/ 
+1

आप बफरिंग समाप्त करने के लिए php register_shutdown_function का उपयोग कर सकते हैं, और HTML पुनर्प्राप्त कर सकते हैं। – Simon

+0

इसमें एक दोष है, आप कॉलबैक के अंदर 'ob_start, ob_clean, ..' को कॉल नहीं कर सकते, जिसे विशेष कैशिंग तर्क के लिए आवश्यक है। http://php.net/manual/en/function.ob-start.php#refsect1-function.ob-start-parameters –

3

आप में देख कोशिश हो सकती है WP-शामिल/formatting.php फ़ाइल। उदाहरण के लिए, wpautop समारोह। यदि आप पूरे पृष्ठ के साथ कुछ करने की तलाश में हैं, तो सुपर कैश प्लगइन देखें। वह अंतिम वेब पेज को कैशिंग के लिए फ़ाइल में लिखता है। यह देखते हुए कि प्लग-इन कैसे काम करता है, आपको कुछ विचार दे सकते हैं।

2

वास्तव में पूर्ण पृष्ठ संशोधन के विषय के बारे में WP-Hackers मेलिंग सूची पर हाल ही में एक विवाद हुआ था और ऐसा लगता है कि सर्वसम्मति यह थी कि ob_start() आदि के साथ आउटपुट बफरिंग एकमात्र वास्तविक समाधान था। इसके ऊपर और डाउनसाइड्स के बारे में कुछ चर्चा भी हुई: http://groups.google.com/group/wp-hackers/browse_thread/thread/e1a6f4b29169209a#

संक्षेप में: यह काम करता है और आवश्यक होने पर सबसे अच्छा समाधान है (जैसे WP-Supercache प्लगइन में) लेकिन समग्र गति धीमा कर देता है क्योंकि आपकी सामग्री नहीं है ब्राउज़र को इसके तैयार होने के रूप में भेजने की अनुमति है, लेकिन इसे आपके द्वारा संसाधित किए जाने से पहले और ब्राउज़र पर भेजे जाने से पहले पूर्ण दस्तावेज़ को (ob_end() के लिए) प्रस्तुत करना होगा।

19

प्रश्न शायद पुराना है, लेकिन मुझे इसे करने का एक बेहतर तरीका मिला है। buffer_start और buffer_end -

function callback($buffer) { 
    // modify buffer here, and then return the updated code 
    return $buffer; 
} 

function buffer_start() { ob_start("callback"); } 

function buffer_end() { ob_end_flush(); } 

add_action('wp_head', 'buffer_start'); 
add_action('wp_footer', 'buffer_end'); 

स्पष्टीकरण इस प्लगइन कोड दो कार्यों पंजीकृत करता है।

buffer_start एचटीएमएल के हेडर सेक्शन के अंत में निष्पादित किया गया है। पैरामीटर, callback फ़ंक्शन, आउटपुट बफरिंग के अंत में कॉल किया जाता है। यह पृष्ठ के पाद लेख पर होता है, जब दूसरी पंजीकृत कार्रवाई, buffer_end, निष्पादित करता है।

callback फ़ंक्शन वह है जहां आप आउटपुट के मान को बदलने के लिए अपना कोड जोड़ते हैं ($buffer चर)। फिर आप बस संशोधित कोड वापस कर दें और पृष्ठ प्रदर्शित किया जाएगा।

नोट्स buffer_start, buffer_end, और callback के लिए अद्वितीय फ़ंक्शन नाम का उपयोग सुनिश्चित करें, ताकि वे अन्य कार्यों आप प्लग इन में हो सकता है के साथ संघर्ष नहीं है।

+1

आप अपने उदाहरणों को उपसर्ग या प्रत्ययित कर सकते हैं: 'buffer_start_so_772510' या' so_772510_callback' (मुझे प्रत्यय पसंद है , क्योंकि इसे पढ़ना आसान है)। इस तरह, जब कोड कहीं और सतह पर आता है, तो हम जानते हैं कि यह कहां से आया था;) – brasofilo

+0

यह काम नहीं करता है जब आप फूटर तत्व – user225269

+0

के बाद मौजूद चीजों को संशोधित या निकालना चाहते हैं, तो मैं Kwoodfriend के समाधान का उपयोग करने की सलाह देता हूं, क्योंकि यह बहुत अधिक है सुरक्षित (उदाहरण के लिए आप आउटपुट में हेरफेर करने के लिए आखिरी व्यक्ति बन सकते हैं)। – Robert

38

वर्डप्रेस में "अंतिम आउटपुट" फ़िल्टर नहीं है, लेकिन आप एक साथ हैक कर सकते हैं। नीचे दिया गया उदाहरण एक परियोजना के लिए बनाए गए "Must Use" प्लगइन के भीतर रहता है।

नोट: मैंने किसी भी प्लगइन के साथ परीक्षण नहीं किया है जो "शटडाउन" कार्रवाई का उपयोग कर सकता है।

प्लगइन सभी खुले बफर स्तरों के माध्यम से पुनरावृत्ति करके, उन्हें बंद करने और उनके आउटपुट को कैप्चर करने के द्वारा काम करता है। इसके बाद फ़िल्टर किए गए सामग्री को प्रतिबिंबित करते हुए "final_output" फ़िल्टर को निकाल दिया जाता है।

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

WP-सामग्री/म्यू plugins/buffer.php

<?php 

/** 
* Output Buffering 
* 
* Buffers the entire WP process, capturing the final output for manipulation. 
*/ 

ob_start(); 

add_action('shutdown', function() { 
    $final = ''; 

    // We'll need to get the number of ob levels we're in, so that we can iterate over each, collecting 
    // that buffer's output into the final output. 
    $levels = ob_get_level(); 

    for ($i = 0; $i < $levels; $i++) { 
     $final .= ob_get_clean(); 
    } 

    // Apply any filters to the final output 
    echo apply_filters('final_output', $final); 
}, 0); 

final_output फिल्टर में hooking का एक उदाहरण:

<?php 

add_filter('final_output', function($output) { 
    return str_replace('foo', 'bar', $output); 
}); 

संपादित करें:

इस कोड को गुमनाम का उपयोग करता है फ़ंक्शंस, जो केवल PHP 5.3 या नए में समर्थित हैं। यदि आप PHP 5.2 या पुराने का उपयोग कर वेबसाइट चला रहे हैं, तो आप स्वयं को एक अक्षम कर रहे हैं। PHP 5.2 2006 में जारी किया गया था, और भले ही वर्डप्रेस अभी भी इसका समर्थन करता है, आपको इसका उपयोग नहीं करना चाहिए।

+1

नोट: मैंने केवल संस्करण 3.8 में इसका परीक्षण किया है। – kfriend

+1

आपको बहुत बहुत धन्यवाद, यह सबसे सुंदर समाधान है। – petermolnar

+0

बहुत बढ़िया, निश्चित रूप से बहुत ही सुरुचिपूर्ण! – Robert

7

@jacer, यदि आप निम्न हुक का उपयोग करते हैं, तो header.php भी शामिल हो जाता है।

function callback($buffer) {  
    $buffer = str_replace('replacing','width',$buffer); 
    return $buffer; 
} 

function buffer_start() { ob_start("callback"); } 
function buffer_end() { ob_end_flush(); } 

add_action('after_setup_theme', 'buffer_start'); 
add_action('shutdown', 'buffer_end'); 
+1

कोई ऐसा पोस्ट न करने का प्रयास करें जो किसी अन्य उत्तर का संदर्भ देता है (और संदर्भ प्राप्त करने के लिए अन्य उत्तर पढ़ने की आवश्यकता है); आपके उत्तर को उस उत्तर से अलग किया जाता है जिसका आप संदर्भ दे रहे हैं, यह समझना मुश्किल है कि आप क्या कह रहे हैं। साथ ही, जब तक आप क्रेडिट दे रहे हैं, तब तक क्रेडिट देने के लिए दूसरों के निर्माण का उत्तर पोस्ट करना जरूरी नहीं है। –

+2

[http://www.dagondesign.com/articles/wordpress-hook-for-entire-page-using-output-buffering/](http://www.dagondesign.com/articles/wordpress-hook-for- संपूर्ण पृष्ठ-उपयोग-आउटपुट-बफरिंग /) - यह लिंक है, कि यह उत्तर कॉपी हो गया है। –

1

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

अद्यतन और sollution:

मेरे लिए KFRIEND फ्लॉप काम से कोड इस कब्जा वर्डप्रेस, नहीं एक ही उत्पादन से असंसाधित स्रोत है कि ब्राउज़र वास्तव में समाप्त होता है के रूप में। मेरा सॉल्शन संभवतः सामग्री को बफर करने के लिए ग्लोबल्स वैरिएबल का उपयोग करके सुरुचिपूर्ण नहीं है - लेकिन कम से कम मुझे पता है कि ब्राउजर को वितरित किए गए समान HTML को प्राप्त करें। हो सकता है कि प्लगइन के विभिन्न सेटअप समस्याएं पैदा करते हैं लेकिन ऊपर जैकर ओमरी द्वारा कोड उदाहरण के लिए धन्यवाद, मैं इसके साथ समाप्त हुआ।

यह कोड मेरे मामले में आमतौर पर functions फ़ोल्डर में functions.php में स्थित है।

$GLOBALS['oldschool_buffer_variable'] = ''; 
function sc_callback($data){ 
    $GLOBALS['final_html'] .= $data; 
    return $data; 
} 
function sc_buffer_start(){ 
    ob_start('sc_callback'); 
} 
function sc_buffer_end(){ 
    // Nothing makes a difference in my setup here, ob_get_flush() ob_end_clean() or whatever 
    // function I try - nothing happends they all result in empty string. Strange since the 
    // different functions supposedly have very different behaviours. Im guessing there are 
    // buffering all over the place from different plugins and such - which makes it so 
    // unpredictable. But that's why we can do it oldschool :D 
    ob_end_flush(); 

    // Your final HTML is here, Yeeha! 
    $output = $GLOBALS['oldschool_buffer_variable']; 
} 
add_action('wp_loaded', 'sc_buffer_start'); 
add_action('shutdown', 'sc_buffer_end'); 
संबंधित मुद्दे

 संबंधित मुद्दे