Xóa một hành động khỏi Lớp bên ngoài


8

Tôi đang cố gắng làm một cái gì đó tương tự như câu hỏi này ở đây: remove_action hoặc remove_filter với các lớp bên ngoài?

Tôi đang cố gắng để loại bỏ

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

tin nhắn từ plugin.

Và trước khi bạn mắng tôi về việc làm thế nào điều này có thể là phi đạo đức, tác giả nói rằng bạn nên làm ở đây: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-yoast-message-in-page-headers? reply = 29 # post-2503485

Tôi đã tìm thấy lớp thêm nhận xét ở đây: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/ class- frontend.php

Về cơ bản WPSEO_Frontendlớp có một hàm được đặt tên debug_markersau đó được gọi bởi một hàm có tên headsau đó được thêm wp_headvào__Construct

Tôi mới tham gia lớp học nhưng tôi đã tìm ra cách để loại bỏ hoàn toàn cái đầu bằng cách làm

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

nhưng tôi chỉ muốn loại bỏ debug_markerphần đó Tôi đã thử điều này nhưng nó không hoạt động remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Như tôi đã nói tôi mới tham gia lớp học nên mọi sự giúp đỡ đều tuyệt vời.

Câu trả lời:


5

Một cách đơn giản để đạt được điều này (nhưng không có cách tiếp cận Class) là lọc đầu ra của wp_headhook hành động bằng cách sử dụng bộ đệm đầu ra .

Trong chủ đề của bạn header.php, hãy kết thúc wp_head()cuộc gọi ob_start($cb)và các ob_end_flush();chức năng như:

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

Bây giờ trong functions.phptệp chủ đề , khai báo chức năng gọi lại đầu ra của bạn ( ad_filter_wp_head_outputtrong trường hợp này):

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

Nếu bạn muốn thực hiện tất cả những điều đó thông qua tệp functions.phpmà không cần chỉnh sửa header.php, bạn có thể móc vào get_headerwp_headmóc hành động để xác định phiên đệm đầu ra:

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

Tôi đã sử dụng phương thức hook để không phải chỉnh sửa header.php. Cảm ơn.
Brooke.

4

Cảm ơn tất cả sự giúp đỡ của bạn, cuối cùng tôi đã giải quyết nó. Tôi đã tạo một hàm.php cho chủ đề con của mình, sau đó thêm

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

Đây là câu trả lời hay nhất
sMstyle

Nếu bạn không thể truy cập vào đối tượng lớp, bạn có thể sử dụng my remove_class_actionđể xóa hành động / bộ lọc gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMstyle

3

Tôi không nghĩ rằng bạn sẽ có thể làm điều đó bằng cách sử dụng remove_action. Đối số hàm trong remove_actionsẽ không giúp bạn vì debug_marker()hàm không phải là hàm được sử dụng trong add_action()cuộc gọi.

Yoast có lẽ có một cái gì đó giống như add_action( "wp_head", "head" )trong mã của mình. Vì vậy, bạn có thể loại bỏ chức năng "head", nhưng debug_markerkhông được thêm rõ ràng dưới dạng một hành động.

Bạn có thể

  1. Chỉnh sửa tệp nguồn của Yoast và xóa dòng nhận xét gỡ lỗi.
  2. Mở rộng WPSEO_Frontendlớp và nạp chồng debug_markerhàm để trả về "". TBH, tôi không chắc nó sẽ hoạt động như thế nào khi WP tải plugin, nhưng có thể đáng để nghiên cứu.

Cảm ơn, tôi thực sự không muốn chỉnh sửa tập tin. Tôi sẽ quan tâm đến việc học cách mở rộng lớp học nhưng đây là một chút kiến ​​thức của tôi.
Brooke.

Steve, tôi đã thử giải pháp 2 trước khi va vào bài viết của bạn. Mặc dù tôi đã có vấn đề hoàn thành việc này. Tôi đã đăng tiến trình của tôi như là một câu trả lời trong trang này. wordpress.stackexchange.com/a/209800/84030 Sự giúp đỡ của bạn sẽ được đánh giá cao nếu bạn có ý tưởng làm thế nào tôi có thể giải quyết điều này.
Adrien Be

2

Tìm chủ đề này sau khi làm việc trên cùng một giải pháp như giải pháp được đề cập bởiSteve Claridge , đó là:

Mở rộng WPSEO_Frontendlớp và nạp chồng debug_markerhàm để trả về ""

Tôi đã trình bày chi tiết các bước dưới đây, mặc dù tôi đang bị kẹt ở bước cuối cùng.


Tạo một plugin tùy biến

Như đã đề cập trong bài viết này từ WP Tavern , "cách dễ nhất để thực hiện điều này là tạo một plugin chức năng sẽ chạy cùng với nó".

Vì vậy, tôi đã tiếp tục tạo plugin đầu tiên của mình sau bài viết này từ ElegantTheme .

Mở rộng các lớp có liên quan.

Đó là khi mọi thứ trở nên phức tạp. Tôi đã thêm vào sau đây nhưng chức năng ghi đè của tôi vẫn không được kích hoạt vì một số lý do.

//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
Oh, cảm ơn vì đã chỉ ra điều này! Yoast WordPress Seo có một loạt các hành động và bộ lọc cho phép chúng tôi chỉ thực hiện một số thay đổi đối với các lớp của nó, cách tiếp cận mở rộng lớp có thể giúp tôi loại bỏ một số nội dung trên các bối cảnh cụ thể.
Adriano Monecchi

1

Tôi thấy rằng bạn có thể xóa hành động debug_marker trong hàm.php. Plugin Yoast được thực thi trong hành động wp_head. Tôi vừa thực hiện hook hook hành động ngay sau đó, cụ thể là wp_enqueue_scripts và ở đó tôi đã hook một hàm loại bỏ đầu ra debug_marker. Đối với điều này, bạn cũng phải vượt qua các đối tượng plugin. Ngoài ra, số ưu tiên phải giống với số được đặt trong plugin.

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

Tuy nhiên, điều này không loại bỏ

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

một phần, bởi vì điều đó được lặp lại trong phần đầu chức năng bao bọc quan trọng của plugin . Bạn có thể thử ghi đè lên đó.


1

Để thêm vào câu trả lời của Ahmad, bạn chỉ cần xóa tất cả các nhận xét html với cùng một lượng mã, vì Yoast không phải là plugin duy nhất thực hiện điều đó.

   <?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 cho cách tiếp cận chung. Người ta có thể mất một lúc để xóa bình luận Yoast SEO để chỉ phát hiện ra có một bình luận khác xuất hiện sau khi cài đặt một plugin khác.
Adrien Be

Phải, tôi ghét khi plugin làm điều này. Yoast, revslider, w3 tổng bộ đệm và hầu hết các plugin bộ nhớ cache / thu nhỏ khác, và một tấn khác đều làm điều này.
Bryan Willis

1

Tôi đã bắt gặp một đoạn trích loại bỏ tất cả các bình luận SEO Yoast khỏi giao diện người dùng. Nó cũng sửa đổi cách tiếp cận bộ đệm đầu ra mà câu trả lời của @ bryan-willis và @ ahmad-m sử dụng.

Chỉ cần đặt đoạn mã trên chủ đề của bạn functions.phphoặc tệp php / plugin tùy chỉnh của chủ đề.

Tôi sẽ để nó ở đây làm tài liệu tham khảo - tín dụng dành cho tác giả của đoạn trích

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

Đây là phiên bản sửa đổi của @ ahmad-m Trả lời , bằng cách áp dụng các bộ lọc, bạn có thể thực hiện nhiều thay đổi nội dung cho tiêu đề 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

Tìm thấy một giải pháp tương tự functions.phpkhông sử dụng mức độ ưu tiên được mã hóa cứng 2mà tự động đọc và sử dụng mức độ ưu tiên từ Yoast 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

Xem hàm flush_cache trong wordpress-seo / frontend / class-frontend.php

Tìm dòng mã này

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

Thay bằng

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

Cảm ơn người tạo ra plugin tuyệt vời này.


Không bao giờ thay đổi bất kỳ tập tin trong bất kỳ chủ đề, plugin hoặc cốt lõi nếu bạn không phải là tác giả. Ngoài ra, vui lòng không sử dụng trang web này vì lý do quảng cáo.
Pieter Goosen

Xin lỗi, tôi không thực hiện một chương trình khuyến mãi. Tôi chỉ cung cấp một giải pháp khác. Có lẽ không phải là tốt nhất.
Wakanina

xem xét việc quyên góp là khuyến mãi, bạn có thể hưởng lợi trực tiếp hoặc gián tiếp từ tài chính này
Pieter Goosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.