Как удалить действия из плагина Yoast SEO

Мне нужно удалить действия, которые добавил Yoast SEO. Это мой код:

function remove_actions() {

// deregister all not more required tags
    remove_action( 'wp_head', '_wp_render_title_tag', 50 );
    remove_action( 'wp_head', array( 'WPSEO_Frontend', 'test123' ), 50 );
    remove_action( 'wp_head', array( 'WPSEO_Frontend', 'front_page_specific_init' ), 50 );
    remove_action( 'wp_head', array( 'WPSEO_Frontend', 'head' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'head' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'metadesc' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'robots' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'metakeywords' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'canonical' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'adjacent_rel_links' ), 50 );
    remove_action( 'wpseo_head', array( 'WPSEO_Frontend', 'publisher' ), 50 );

}
add_action( 'wp_head', 'remove_actions', 1000 );

Этот код не удаляет действия. Что не так? Как я могу успешно удалить действия?


person bradley546994    schedule 13.01.2018    source источник
comment
Я редактирую исходный код yoast seo и добавляю действие test123, когда я пытаюсь удалить его с помощью этой функции, оно не работает, и test123 все еще отображается в исходном коде на моей странице.   -  person bradley546994    schedule 13.01.2018


Ответы (2)


Рассмотрим эти примечания из документации remove_action:

  1. Возможно, вам потребуется отдать приоритет удалению действия хуку, который возникает после добавления действия.
  2. Вы не можете успешно удалить действие, пока оно не будет добавлено.
  3. Вы также не можете удалить действие после его выполнения.
  4. Для удаления действия приоритет должен совпадать с приоритетом функции, которая была изначально добавлена.

В вашем случае я считаю, что некоторые из этих проблем (особенно № 3 и № 4) вызывают проблемы:

Во-первых, приоритет вашего add_action слишком высок. При установке этого значения он запускается после выполнения всех действий Yoast wp_head. Вместо этого подключитесь к тому же действию, которое хотите удалить, но с очень низким числом, например -99999, чтобы оно выполнялось до выполнения действий Yoast. (Кроме того, я разделил на две функции, просто чтобы убедиться, что они запускаются в нужное время — по одной для каждого действия — wp_head и wpseo_head).

Во-вторых, ваши приоритеты не совпадают с приоритетами в коде Yoast. Я перерыл весь код Yoast, чтобы найти все эти действия и задокументировать/исправить в приведенном ниже коде — и я могу сказать вам, например, что хук metakeywords в коде Yoast равен 11, поэтому ваше действие remove_action (с приоритетом 40) не будет Работа.

Наконец, Yoast добавляет эти действия в $this (экземплярную версию класса WPSEO_Frontend), а не в статическую версию методов класса. Это означает, что remove_action не может найти их, например, на основе массива функций (WPSEO_Frontend, head). Вместо этого вам нужно загрузить созданную версию Yoast и передать это remove_action функциям.

Документированный код ниже:

// Remove ONLY the head actions.  Permits calling this at a "safe" time
function remove_head_actions() {
    // not Yoast, but WP default. Priority is 1
    remove_action( 'wp_head', '_wp_render_title_tag', 1 );

    // If the plugin isn't installed, don't run this!
    if ( ! is_callable( array( 'WPSEO_Frontend', 'get_instance' ) ) ) {
        return;
    }

    // Get the WPSEO_Frontend instantiated class
    $yoast = WPSEO_Frontend::get_instance();
    // removed your "test" action - no need
    // per Yoast code, this is priority 0
    remove_action( 'wp_head', array( $yoast, 'front_page_specific_init' ), 0 );
    // per Yoast code, this is priority 1
    remove_action( 'wp_head', array( $yoast, 'head' ), 1 );
}

function remove_wpseo_head_actions() {
    // If the Yoast plugin isn't installed, don't run this
    if ( ! is_callable( array( 'WPSEO_Frontend', 'get_instance' ) ) ) {
        return;
    }

    // Get the Yoast instantiated class
    $yoast = WPSEO_Frontend::get_instance();
    remove_action( 'wpseo_head', array( $yoast, 'head' ), 50 );
    // per Yoast code, this is priority 6
    remove_action( 'wpseo_head', array( $yoast, 'metadesc' ), 6 );
    // per Yoast code, this is priority 10
    remove_action( 'wpseo_head', array( $yoast, 'robots' ), 10 );
    // per Yoast code, this is priority 11
    remove_action( 'wpseo_head', array( $yoast, 'metakeywords' ), 11 );
    // per Yoast code, this is priority 20
    remove_action( 'wpseo_head', array( $yoast, 'canonical' ), 20 );
    // per Yoast code, this is priority 21
    remove_action( 'wpseo_head', array( $yoast, 'adjacent_rel_links' ), 21 );
    // per Yoast code, this is priority 22
    remove_action( 'wpseo_head', array( $yoast, 'publisher' ), 22 );
}

Заключительные примечания:.

Удаление действия WPSEO_Frontend::head очень сложно. Это приведет к удалению целого ряда других вещей, которые вы, вероятно, не хотите удалять.

Во-вторых, вероятно, лучше изменить выходные данные этих действий, а не удалять их полностью.

Например,

add_action('wpseo_metakeywords', 'your_metakeywords_function');

function your_metakeywords_function( $keywords ) {
    // modify the keywords as desired
    return $keywords;
}
person random_user_name    schedule 13.01.2018
comment
Спасибо. Требуется удалить Yoast из 1 документа. Ваш ответ был очень полезен! - person WhereDidMyBrainGo; 27.02.2018
comment
wpseo_metakeywords, к сожалению, безальтернативно устарел, начиная с версии 6.3. Просто оставьте это здесь для будущих посетителей. - person Joscha; 26.07.2019

Многие из этих действий имеют фильтры, и вывод можно удалить, вернув false.

// Removes 'meta name="description"' tag from output

add_filter( 'wpseo_metadesc', 'my_custom_metadesc' );

function my_custom_metadesc() {
  return false;
}

В некоторых случаях, таких как WPSEO_Opengraph, используется шаблон фильтра: wpseo_og_ + имя свойства с подчеркиванием вместо двоеточия.

// Filters '<meta property="article:tag" content="Foo" />'

add_filter( 'wpseo_og_article_tag', 'my_custom_article_tag' );
person Slam    schedule 21.01.2019