如何从Yoast SEO插件中删除操作

时间:2018-01-13 00:39:30

标签: wordpress yoast

我需要删除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 );

此代码不会删除操作。怎么了?如何成功删除操作?

2 个答案:

答案 0 :(得分:2)

请考虑remove_action文档中的这些说明:

  
      
  1. 您可能需要优先将操作移除到添加操作后发生的挂钩。
  2.   
  3. 在添加操作之前,您无法成功删除该操作。
  4.   
  5. 运行后也无法删除操作。
  6.   
  7. 要删除某个操作,优先级必须与最初添加的功能相匹配。
  8.   

在您的情况下,我相信其中一些问题(尤其是#3和#4)会导致问题:

首先,add_action的优先级太高。通过将其设置为高,它会在运行所有Yoast wp_head操作后运行。相反,挂钩到您要删除的相同操作,但使用非常编号(例如-99999),以使其在运行Yoast操作之前运行。 (此外,我已经分成两个功能,只是确保它们在正确的时间运行 - 每个操作一个 - wp_headwpseo_head)。

其次,您的优先级与Yoast代码中的优先级不匹配。我已经挖掘了所有的Yoast代码来查找所有这些操作并在下面的代码中记录/更正 - 我可以告诉你例如Yoast代码中的metakeywords钩子是11,所以你的remove_action(优先级) 40)不会工作。

最后,Yoast将这些操作添加到$this(WPSEO_Frontend类的实例化版本),而不是类方法的静态版本。这意味着remove_action无法根据函数数组(WPSEO_Frontendhead)找到它们。相反,您需要加载实例化的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;
}

答案 1 :(得分:0)

其中许多操作都有过滤器,可以通过返回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' );