ลบการกระทำออกจาก Class ภายนอก


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- อันตราย -inserted-Yoast ข้อความในหน้าเว็บส่วนหัว? ตอบกลับ = 29 # โพสต์ 2503475

ฉันพบคลาสที่เพิ่มความคิดเห็นที่นี่: 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_headto hooks การกระทำเพื่อกำหนดเซสชันบัฟเฟอร์ออก:

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;
}

ฉันไปกับวิธีการของ hook ดังนั้นฉันไม่ต้องแก้ไข header.php ขอบคุณ
บรูค

4

ขอบคุณสำหรับความช่วยเหลือของคุณฉันก็แก้ไขมันในที่สุด ฉันสร้าง function.php สำหรับชุดรูปแบบลูกของฉันแล้วเพิ่ม

// 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/c6518efc1753cf2392559866b4bd1a53
sMyles

3

ฉันไม่คิดว่าคุณจะสามารถใช้สิ่งremove_actionนั้นได้ อาร์กิวเมนต์ของฟังก์ชัน in remove_actionจะไม่ช่วยคุณเนื่องจากdebug_marker()ฟังก์ชันไม่ใช่ฟังก์ชันที่ใช้ในการadd_action()โทร

Yoast น่าจะมีบางอย่างadd_action( "wp_head", "head" )ในรหัสของเขา ดังนั้นคุณสามารถลบฟังก์ชั่น "หัว" แต่debug_markerไม่ได้เพิ่มเป็นการกระทำอย่างชัดเจน

คุณทำได้

  1. แก้ไขไฟล์ต้นฉบับของ Yoast และลบบรรทัดข้อคิดเห็น debug
  2. ขยายWPSEO_Frontendคลาสและโอเวอร์โหลดdebug_markerฟังก์ชันเพื่อส่งคืน "" TBH ฉันไม่แน่ใจว่ามันจะทำงานอย่างไรในแง่ของ WP ที่โหลดปลั๊กอิน แต่อาจคุ้มค่ากับการตรวจสอบ

ขอบคุณฉันไม่ต้องการแก้ไขไฟล์ ฉันสนใจที่จะเรียนรู้วิธีการขยายชั้นเรียน แต่นี่ไม่ใช่ความรู้ของฉัน
บรูค

Steve ฉันกำลังลองวิธีที่ 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 มีการกระทำและตัวกรองมากมายที่ทำให้เราสามารถเปลี่ยนแปลงคลาสได้เพียงบางส่วนการขยายชั้นเรียนอาจช่วยฉันได้มากในการกำจัดสิ่งต่าง ๆ ในบริบทเฉพาะ
Adriano Monecchi

1

ฉันพบว่าคุณสามารถลบการกระทำ debug_marker ใน functions.php ปลั๊กอิน Yoast ถูกเรียกใช้งานในการดำเนินการ wp_head ฉันเพิ่งใช้ hook action ซึ่งตามมาหลังจากนั้นโดยตรงคือ wp_enqueue_scripts และฉันก็ติดตั้งฟังก์ชันที่ลบเอาต์พุต debug_marker สำหรับสิ่งนี้คุณต้องผ่านวัตถุปลั๊กอิน นอกจากนี้หมายเลขลำดับความสำคัญจะต้องเหมือนกันกับชุดหนึ่งจากภายในปลั๊กอิน

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

เพื่อเพิ่มคำตอบของ Ahmad คุณสามารถลบความคิดเห็น html ทั้งหมดที่มีโค้ดจำนวนเท่ากันเนื่องจาก Yoast ไม่ใช่ปลั๊กอินเดียวที่ทำเช่นนั้น

   <?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 จะเป็น

ใช่ฉันเกลียดเมื่อปลั๊กอินทำเช่นนี้ Yoast, revslider, แคชทั้งหมด w3 และปลั๊กอินแคช / การย่อส่วนอื่น ๆ ส่วนใหญ่และอื่น ๆ ทั้งหมดทำเช่นนี้
ไบรอันวิลลิส

1

ฉันพบตัวอย่างที่ลบความคิดเห็น Yoast WordPress SEO ทั้งหมดจากส่วนหน้า นอกจากนี้ยังปรับเปลี่ยนวิธีการบัฟเฟอร์เอาต์พุตที่ @ 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 Answerโดยใช้ตัวกรองคุณสามารถทำการเปลี่ยนแปลงเนื้อหาหลายรายการในส่วนหัว 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ที่ไม่ได้ใช้สิทธิ์ hardcoded 2แต่แบบไดนามิกอ่านและใช้จัดลำดับความสำคัญจาก add_action()Yoast

// 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

ดูฟังก์ชั่น flush_cache ใน wordpress-seo / frontend / class-frontend.php

ค้นหาบรรทัดของรหัสนี้

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

ขอบคุณผู้สร้างปลั๊กอินที่ยอดเยี่ยมนี้


ห้ามเปลี่ยนไฟล์ใด ๆ ในธีมปลั๊กอินหรือคอร์หากคุณไม่ใช่ผู้แต่ง นอกจากนี้โปรดอย่าใช้เว็บไซต์นี้เพื่อส่งเสริมการขาย
Goosen ปีเตอร์

ขออภัยฉันไม่ได้ทำการส่งเสริม ฉันให้โซลูชันอื่น อาจไม่ใช่สิ่งที่ดีที่สุด
Wakanina

พิจารณาทำการบริจาคเป็นการส่งเสริมการขายคุณได้รับประโยชน์โดยตรงหรือโดยอ้อมจากเงินช่วยเหลือนี้
Pieter Goosen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.