외부 클래스에서 작업 제거


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-dangerous -inserted-yoast-message-in-page-headers? replies = 29 # post-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_headerwp_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;
}

나는 hook 메소드를 사용하여 header.php를 편집 할 필요가 없었습니다. 감사.
브룩.

4

모든 도움에 감사드립니다. 마침내 해결되었습니다. 내 자식 테마에 대한 functions.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

클래스 객체에 액세스 할 수없는 경우 my remove_class_action를 사용 하여 action / filter gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles

3

나는 당신이 그것을 사용하여 그렇게 할 수 있다고 생각하지 않습니다 remove_action. 함수 인수 remove_actiondebug_marker()함수가 add_action()호출 에 사용 된 함수가 아니기 때문에 도움 이되지 않습니다 .

Yoast는 아마도 add_action( "wp_head", "head" )그의 코드 와 같은 것을 가지고있을 것 입니다. 따라서 "헤드"기능을 제거 할 수 있지만 debug_marker명시 적으로 조치로 추가되지 않았습니다.

넌 할 수있어

  1. Yoast의 소스 파일을 편집하고 디버그 주석 행을 제거하십시오.
  2. WPSEO_Frontend클래스를 확장하고 debug_marker""를 반환 하도록 함수를 오버로드하십시오 . TBH, 플러그인로드 WP 측면에서 이것이 어떻게 작동하는지 잘 모르겠지만 조사 할 가치가 있습니다.

고마워, 나는 정말로 파일을 편집하고 싶지 않다. 나는 수업을 확장하는 방법을 배우는 데 관심이 있지만 이것은 내 지식이 약간입니다.
브룩.

스티브, 나는 당신의 게시물에 부딪 치기 전에 솔루션 2를 시도하고있었습니다. 나는 이것을 완성하는 데 문제가 있었지만. 이 페이지에 진행 상황을 답변으로 게시했습니다. wordpress.stackexchange.com/a/209800/84030 이 문제를 해결할 수있는 방법에 대한 아이디어가 있으면 도움을 주시면 감사하겠습니다.
Adrien :

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 2016 년

1

functions.php에서 debug_marker 액션을 제거 할 수 있다는 것을 발견했습니다. Yoast 플러그인은 wp_head 작업에서 실행됩니다. 방금 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. -->

플러그인의 중요한 래퍼 함수 head에 에코되기 때문에 part . 덮어 쓸 수 있습니다.


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 total cache 및 대부분의 다른 캐시 / 축소 플러그인 및 기타 많은 것들이이 작업을 수행합니다.
Bryan Willis

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하드 코딩 된 우선 순위를 사용하지 않지만 2Yoast의 우선 순위를 동적으로 읽고 사용 하는 비슷한 솔루션을 찾았 습니다 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 );

이 훌륭한 플러그인을 만든 사람에게 감사합니다.


저자가 아닌 경우 테마, 플러그인 또는 코어의 파일을 절대로 변경하지 마십시오. 또한 프로모션 목적으로이 사이트를 사용하지 마십시오.
Pieter Goosen

죄송합니다. 프로모션을하지 않습니다. 다른 솔루션을 제공합니다. 아마도 최고는 아닙니다.
와카 니나

기부 만들 생각 당신도이 finansialy에서 직접 또는 간접적으로 혜택을, 승진이다
피터 구센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.