बाहरी कक्षा से कोई क्रिया निकालें


8

मैं यहाँ इस प्रश्न के समान कुछ करने की कोशिश कर रहा हूँ: remove_action या remove_filter बाहरी वर्गों के साथ?

मैं निकालने की कोशिश कर रहा हूं

<!-- This site is optimized with the Yoast WordPress SEO plugin v1.0.3 - http;//yoast.com/wordpress/seo/ -->

प्लगइन से संदेश।

और इससे पहले कि आप मुझ पर चिल्लाएं कि यह कैसे अनैतिक हो सकता है लेखक कहता है कि यह यहाँ करना ठीक है: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-delense -inserted-yoast-संदेश-इन-पेज-हेडर? उत्तरों = 29 # के बाद 2,503,475

मुझे वह वर्ग मिला है जो यहाँ टिप्पणी जोड़ता है: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

मूल रूप से WPSEO_Frontendकक्षा में एक फ़ंक्शन debug_markerहोता है जिसे तब एक फ़ंक्शन द्वारा बुलाया जाता है headजिसे बाद में जोड़ा जाता wp_headहै__Construct

मैं कक्षाओं में नया हूँ लेकिन मुझे ऐसा करने से सिर को पूरी तरह से हटाने का एक तरीका मिल गया

global $wpseo_front;    
remove_action( 'wp_head', array($wpseo_front,'head'), 1, 1 );

लेकिन मैं केवल इसका debug_markerहिस्सा निकालना चाहता हूं । मैंने यह कोशिश की, लेकिन यह काम नहीं किया remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

जैसा कि मैंने कहा कि मैं कक्षाओं में नया हूँ इसलिए कोई भी मदद बहुत बढ़िया होगी।

जवाबों:


5

इसे प्राप्त करने का एक सरल तरीका (लेकिन वर्ग दृष्टिकोण के बिना) आउटपुट बफ़रिंगwp_head का उपयोग करके एक्शन हुक के आउटपुट को फ़िल्टर करना है ।

अपने विषय में header.php, जैसे और कार्यों के wp_head()साथ कॉल लपेटें :ob_start($cb)ob_end_flush();

ob_start('ad_filter_wp_head_output');
wp_head();
ob_end_flush();

अब थीम functions.phpफ़ाइल में, अपना आउटपुट कॉलबैक फ़ंक्शन ( ad_filter_wp_head_outputइस मामले में) घोषित करें :

function ad_filter_wp_head_output($output) {
    if (defined('WPSEO_VERSION')) {
        $output = str_ireplace('<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - http://yoast.com/wordpress/seo/ -->', '', $output);
        $output = str_ireplace('<!-- / Yoast WordPress SEO plugin. -->', '', $output);
    }
    return $output;
}

यदि आप functions.phpबिना संपादन header.phpफ़ाइल के माध्यम से वह सब करना चाहते हैं , तो आप आउटपुट बफ़रिंग सत्र को परिभाषित करने के लिए हुक get_headerऔर wp_headएक्शन हुक कर सकते हैं :

add_action('get_header', 'ad_ob_start');
add_action('wp_head', 'ad_ob_end_flush', 100);
function ad_ob_start() {
    ob_start('ad_filter_wp_head_output');
}
function ad_ob_end_flush() {
    ob_end_flush();
}
function ad_filter_wp_head_output($output) {
    if (defined('WPSEO_VERSION')) {
        $output = str_ireplace('<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - http://yoast.com/wordpress/seo/ -->', '', $output);
        $output = str_ireplace('<!-- / Yoast WordPress SEO plugin. -->', '', $output);
    }
    return $output;
}

मैं हुक विधि के साथ गया था तो मुझे शीर्ष लेख को संपादित करने की जरूरत नहीं होगी। पीपी। धन्यवाद।
ब्रुक।

4

आपकी सभी मदद के लिए धन्यवाद, मैंने आखिरकार इसे हल कर दिया। मैंने अपने चाइल्ड थीम के लिए एक फ़ंक्शन बनाया है। फिर जोड़ें

// we get the instance of the class
$instance = WPSEO_Frontend::get_instance();
/* then we remove the function
    You can remove also others functions, BUT remember that when you remove an action or a filter, arguments MUST MATCH with the add_action
    In our case, we had :
    add_action( 'wpseo_head', array( $this, 'debug_marker' ), 2 );

    so we do : 
    remove_action( 'wpseo_head', array( $this, 'debug_marker' ), 2 );
    */
    remove_action( 'wpseo_head', array( $instance, 'debug_marker' ), 2 );

यह सबसे अच्छा जवाब है
sMyles

यदि आप क्लास ऑब्जेक्ट तक नहीं पहुंच सकते हैं, तो आप remove_class_actionकार्रवाई / फ़िल्टर gist.github.com/tripflex/c6518efc1753cf2392559866b4d1a53
शैलियाँ

3

मुझे नहीं लगता कि आप ऐसा करने में सक्षम होने जा रहे हैं remove_action। फ़ंक्शन तर्क remove_actionआपको मदद नहीं करेगा क्योंकि debug_marker()फ़ंक्शन वह फ़ंक्शन नहीं था जिसका उपयोग add_action()कॉल में किया गया था ।

Yoast संभवतः add_action( "wp_head", "head" )अपने कोड में कुछ पसंद है। तो आप "सिर" फ़ंक्शन को हटा सकते हैं, लेकिन debug_markerकार्रवाई के रूप में स्पष्ट रूप से नहीं जोड़ा गया था।

आप ऐसा कर सकते हैं

  1. योस्ट की स्रोत फ़ाइल को संपादित करें और डिबग टिप्पणी लाइन को हटा दें।
  2. WPSEO_Frontendकक्षा को बढ़ाएँ और debug_marker"" लौटने के लिए फ़ंक्शन को अधिभारित करें । टीबीएच, मुझे यकीन नहीं है कि यह WP प्लगइन को लोड करने के मामले में कैसे काम करेगा, लेकिन जांच के लायक हो सकता है।

धन्यवाद, मैं वास्तव में फ़ाइल को संपादित नहीं करना चाहता। मुझे यह सीखने में दिलचस्पी होगी कि कक्षा का विस्तार कैसे किया जाए लेकिन यह मेरी जानकारी से बाहर है।
ब्रुक।

स्टीव, मैं आपकी पोस्ट में आने से पहले समाधान 2 की कोशिश कर रहा था। हालांकि मुझे इसे पूरा करने में समस्या आ रही थी। मैंने इस पृष्ठ में उत्तर के रूप में अपनी प्रगति पोस्ट की। wordpress.stackexchange.com/a/209800/84030 आपकी मदद की सराहना की जाएगी यदि आपके पास एक विचार है कि मैं इसे कैसे हल कर सकता हूं।
बी

2

इस घोल को उसी घोल पर काम करने के बाद ढूंढना हैSteve Claridge , जिस पर इसका उल्लेख है:

WPSEO_Frontendकक्षा बढ़ाएँ और debug_marker"" लौटने के लिए फ़ंक्शन को अधिभारित करें

मैंने नीचे दिए चरणों को विस्तृत किया है, हालांकि मैं अंतिम चरण में फंस गया हूं।


एक अनुकूलन प्लगइन बनाएँ

जैसा कि WP Tavern के इस लेख में कहा गया है , "इसे पूरा करने का सबसे आसान तरीका एक कार्यक्षमता प्लगइन बनाना है जो इसके साथ-साथ चलेगा"।

तो मैं ElegantTheme के इस लेख के बाद अपना पहला प्लगइन बनाने गया ।

संबंधित वर्ग का विस्तार करें।

तभी चीजें जटिल हो गईं। मैंने निम्नलिखित जोड़ा लेकिन मेरा ओवरराइडिंग फ़ंक्शन अभी भी किसी कारण से ट्रिगर नहीं हुआ है।

//get the base class
if(!class_exists('WPSEO_Frontend')) {
    require_once $_SERVER['DOCUMENT_ROOT'] . '/wp-content/plugins/wordpress-seo/frontend/class-frontend.php';
}

/**
 * Class Definition
 */
class WPSEO_Frontend_GUP extends WPSEO_Frontend{

    /**
     * 
     * OVERRIDES function from YOAST SEO
     * 
     * Outputs or returns the debug marker, which is also used for title replacement when force rewrite is active.
     *
     * @param bool $echo Whether or not to echo the debug marker.
     *
     * @return string
     */
    public function debug_marker( $echo = true ) {
        return '';
    }

}

1
ओह, यह इंगित करने के लिए धन्यवाद! Yoast WordPress Seo में एक्शन और फिल्टर का एक समूह है, जो हमें इसकी कक्षाओं में सिर्फ आंशिक परिवर्तन करने की अनुमति देता है, वर्ग विस्तार दृष्टिकोण मुझे विशिष्ट संदर्भों पर कुछ सामान से छुटकारा पाने में बहुत मदद कर सकता है।
एड्रियानो मोनेची

1

मैंने पाया है कि आप फ़ंक्शन.php में debug_marker कार्रवाई को निकाल सकते हैं। Yoast प्लगइन को wp_head क्रिया में निष्पादित किया जाता है। मैंने सिर्फ एक्शन हुक लिया, जो सीधे उसके बाद आता है, अर्थात् wp_enqueue_scripts और वहां मैंने एक फ़ंक्शन को हुक किया जिसने डिबग_मार्कर आउटपुट को हटा दिया। इसके लिए आपको प्लगइन ऑब्जेक्ट भी पास करना होगा। इसके अलावा प्राथमिकता संख्या प्लगइन के भीतर से एक सेट के समान है।

function remove_debugmarker(){
global $wpseo_front;
remove_action( 'wpseo_head', array($wpseo_front, 'debug_marker') , 2 );
}
add_action('wp_enqueue_scripts','remove_debugmarker');

हालांकि यह दूर नहीं करता है

<!-- / Yoast WordPress SEO plugin. -->

भाग, क्योंकि यह प्लगइन के महत्वपूर्ण आवरण फ़ंक्शन हेड में गूँज रहा है । आप ओवरराइट करने की कोशिश कर सकते हैं।


1

अहमद के जवाब में जोड़ने के लिए आप कोड की समान मात्रा के साथ सभी html टिप्पणियों को हटा सकते हैं, क्योंकि योस्ट एकमात्र ऐसा प्लगइन नहीं है जो ऐसा करता है।

   <?php
   function remove_html_comments_buffer_callback($buffer) {
        $buffer = preg_replace('/<!--[^\[\>\<](.|\s)*?-->/', '', $buffer);
        return $buffer;
    }
    function remove_html_comments_buffer_start() {
        ob_start("remove_html_comments_buffer_callback");
    }
    function remove_html_comments_buffer_end() {
        ob_end_flush();
    }
    add_action('template_redirect', 'remove_html_comments_buffer_start', -1);
    add_action('get_header', 'remove_html_comments_buffer_start'); 
    add_action('wp_footer', 'remove_html_comments_buffer_end', 999);

1
जेनेरिक दृष्टिकोण के लिए +1। Yoast SEO कमेंट को हटाने में कुछ समय लग सकता है केवल यह पता लगाने के लिए कि कोई दूसरा प्लगइन इंस्टॉल करने के बाद कोई और आ रहा है।
Adrien Be

जब मैं प्लग इन करता हूं तो मुझे नफरत है। Yoast, Revslider, w3 कुल कैश और अधिकांश अन्य कैश / minification plugins और एक टन अन्य सभी ऐसा करते हैं।
ब्रायन विलिस

1

मैं एक स्निपेट भर में आया हूं जो सामने के छोर से सभी Yoast वर्डप्रेस एसईओ टिप्पणियों को हटा देता है। यह आउटपुट बफ़रिंग दृष्टिकोण को भी संशोधित करता है जो @ bryan-willis और @ ahmad-m के उत्तरों का उपयोग करता है।

बस अपने विषय functions.phpया एक कस्टम प्लगइन / विषय php फ़ाइल पर स्निपेट रखें ।

मैं इसे एक संदर्भ के रूप में यहाँ छोड़ दूँगा - श्रेय स्निपेट के लेखक को जाता है

/**
 * Yoast WordPress SEO Plugin - Remove All Yoast HTML Comments
 * See at: https://gist.github.com/paulcollett/4c81c4f6eb85334ba076
**/
if (defined('WPSEO_VERSION')){
  add_action('get_header',function (){ ob_start(function ($o){
  return preg_replace('/\n?<.*?yoast.*?>/mi','',$o); }); });
  add_action('wp_head',function (){ ob_end_flush(); }, 999);
}

0

यह @ ahmad-m उत्तर का एक संशोधित संस्करण है , फ़िल्टर लागू करके आप शीर्ष लेख HTML में कई सामग्री परिवर्तन कर सकते हैं।

function header_str_replace_start(){
    ob_start('header_str_replace_output');
}
function header_str_replace_output($output){
    return apply_filters('header_str_replace', $output);
}
function header_str_replace_finish(){
    ob_end_flush();
}
add_action('get_header', 'header_str_replace_start',-1);
add_action('wp_head', 'header_str_replace_finish', 999);


add_filter( 'header_str_replace', 'remove_yeost_seo_comments' ) ;
add_filter( 'header_str_replace', 'remove_white_space');


function remove_yeost_seo_comments($output) {
    $output = str_ireplace('<!-- / Yoast SEO plugin. -->', '', $output);
    return $output;
}


function remove_white_space($content){
     return trim(preg_replace('/\s+/', ' ', $content));
}

0

एक समान समाधान मिला functions.phpजिसके लिए हार्डकॉस्ट प्राथमिकता का उपयोग नहीं करता है 2लेकिन गतिशील रूप से पढ़ता है और योस्ट से प्राथमिकता का उपयोग करता है add_action()

// disable 'This site is optimized with the Yoast SEO ...'
if ( class_exists( 'WPSEO_Frontend') && method_exists( 'WPSEO_Frontend', 'get_instance' ) ) {
    $wpseo_front = WPSEO_Frontend::get_instance();
    if ( $wpseo_dbg_prio = has_action( 'wpseo_head', array( $wpseo_front, 'debug_mark' ) ) ) {
        remove_action( 'wpseo_head', array( $wpseo_front, 'debug_mark'), $wpseo_dbg_prio );
    }
}

-3

WordPress-seo / frontend / class-frontend.php में flush_cache फ़ंक्शन देखें

इस कोड की लाइन का पता लगाएं

$content = str_replace( $this->debug_marker( false ), $this->debug_marker( false ) . "\n" . '<title>' . $title . '</title>', $content );

से बदलो

$content = str_replace( $this->debug_marker( false ), '<title>' . $title . '</title>', $content );

इस महान प्लगइन के निर्माता के लिए धन्यवाद।


यदि आप लेखक नहीं हैं, तो कभी भी किसी भी विषय, प्लगइन या कोर में कोई फ़ाइल न बदलें। इसके अलावा, कृपया प्रचार कारणों से इस साइट का उपयोग न करें।
पीटर ने

क्षमा करें, Im एक पदोन्नति नहीं है। मैं सिर्फ एक और समाधान प्रदान करता हूं। शायद सबसे अच्छा नहीं।
वाकनीना

विचार करें कि एक दान पदोन्नति है, आप या तो प्रत्यक्ष या अप्रत्यक्ष रूप से इस वित्त से लाभान्वित होते हैं
पीटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.