Рассмотрим эти примечания из документации remove_action:
- Возможно, вам потребуется отдать приоритет удалению действия хуку, который возникает после добавления действия.
- Вы не можете успешно удалить действие, пока оно не будет добавлено.
- Вы также не можете удалить действие после его выполнения.
- Для удаления действия приоритет должен совпадать с приоритетом функции, которая была изначально добавлена.
В вашем случае я считаю, что некоторые из этих проблем (особенно № 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