如何使用REMOVE_ACTION删除产品标题后的产品链接

时间:2017-05-27 作者:Aerendir

我正在尝试删除产品页面中产品标题后显示的产品之间的导航。

导航设置在woocommerce.php 我的主题文件:

/**
 * Class for all WooCommerce template modification
 *
 * @version 1.0
 */
class MrBara_WooCommerce {

    ...

    /**
     * Hooks to WooCommerce actions, filters
     *
     * @since  1.0
     * @return void
     */
    function hooks() {
        ...

        // Add prev/next product
        if ( in_array( mrbara_theme_option( \'product_page_layout\' ), array( \'1\', \'2\', \'8\', \'9\', \'12\' ) ) ) {
            add_action( \'woocommerce_single_product_summary\', array( $this, \'products_links\' ), 0 );
        }

        ...

    /**
     * Display products link
     *
     * @since 1.0
     */
    function products_links() {
        if ( function_exists( \'is_product\' ) && ! is_product() ) {
            return;
        }

        $prev_link = \'<span class="ion-ios-arrow-back"></span>\';
        $next_link = \'<span class="ion-ios-arrow-forward"></span>\';

        ...

        ?>
        <div class="products-links">
            <?php
            previous_post_link( \'<div class="nav-previous">%link</div>\', $prev_link );
            next_post_link( \'<div class="nav-next">%link</div>\', $next_link );
            ?>
        </div>
        <?php
    }
}
我刚刚开始了解Wordpress是如何工作的,就目前为止我所了解的情况而言,我认为我必须删除该操作products_links.

Test 1

所以,在我的functions.php 在我的孩子主题中,我写了这样一句话:

// Remove previous and next link in the product title
add_action(\'woocommerce_single_product_summary\', \'remove_products_links\');
function remove_products_links() {
    remove_action(\'products_links\', \'woocommerce_single_product_summary\' );
}
我将“删除函数”添加到woocommerce_single_product_summary 因为添加产品链接的操作与之挂钩。

但这行不通。

所以我深入研究了文档

但这不起作用。

因此,在Wordpress的文档中深入挖掘,我阅读了以下内容:

如果某个操作是从类中添加的,例如通过插件添加的,则删除该操作将需要通过保存类实例的变量访问该类。除非函数是静态的,在这种情况下,您可以直接调用类和函数。

所以,这就是我的情况!我的动作由类添加MrBara_WooCommerce 在方法中hooks() 以及行动的方法products_links() 不是静态的,所以我也需要调用该类。

Test 2

add_action(\'woocommerce_single_product_summary\', \'remove_products_links\');
function remove_products_links() {
    remove_action(\'products_links\', [\'MrBara_WooCommerce\', \'woocommerce_single_product_summary\'] );
}
这也没用。

我也试着处理优先事项remove_products_links9, 在11, 在10 和在0 (以匹配原始添加操作的优先级)但这一切都不起作用。

我想我很接近解决方案,但我的经验不足导致我错过了一些相关设置。

你能帮我更好地理解为什么我remove_action 不起作用?

UPDATE

继续阅读我发现functions.php 我的子主题的文件在父主题的文件之前加载(https://wordpress.stackexchange.com/a/170665/57145).

我对印刷整个$wp_filter 变量使用functions.php 子主题的文件。

所以,打印时,我看到remove_products_links 我注册的操作,但没有看到products_links 我正在尝试删除的操作。

所以我认为注册订单中一定存在一些问题。

现在,我认为我无法删除该操作,因为当我注册删除操作时,我要删除的操作不存在。

The question, so, becomes: how can I remove an action from the parent theme using the child theme?

1 个回复
SO网友:hwl

首先,删除调用products_links 方法将起作用MrBara_WooCommerce->products_links().

在您的函数中。php,您可以使用remove_action 无需将其包装到用作另一个回调的函数中add_action, 顺便提一下

因此:remove_action(\'products_links, array(\'MrBara_WooCommerce\', \'woocommerce_single_product_summary, 0) 10是默认优先级,虽然我们可能认为您的优先级需要高于add_action 因此,在将其包括在内后,需要将其删除,WP codex指出:

要删除操作,优先级必须与最初添加的函数的优先级相匹配。

在添加操作之前,无法成功删除该操作。

运行操作后,也无法删除该操作。

所以,你面临的一个问题可能是add_action 使用默认优先级(10)调用执行以下操作的函数remove action 优先级为0的,则在运行优先级为零的操作后执行此操作。

自子主题起作用以来,子主题与父主题的对比。php在父级之前运行,您需要在设置主题后挂接它。[wp_loaded]1, 一
global $mrbara;
$mrbara = new MrBara_WooCommerce();
function remove_product_links() {
    global $mrbara;
    remove_action(\'product_links\', array($mrbara, \'woocommerce_single_product_summary\') );
}

add_action(\'woocommerce_single_product_summary\', \'remove_products_links\');
init 此处有可能的选项。

使用前面的来回示例:

function remove_products_links() {
    global $mrbara;
    remove_action(\'product_links\', array($mrbara, \'woocommerce_single_product_summary\') );
}

add_action(\'after_setup_theme\', \'remove_products_links\');
原始答案第二个参数需要是这样的数组:

remove_action(\'products_links\', array(\'MrBara_WooCommerce\', \'woocommerce_single_product_summary\' ) );
要从保存类的全局变量访问它,请执行以下操作:

global $mrbara;
$mrbara = new MrBara_WooCommerce();
function remove_product_links() {
    global $mrbara;
    remove_action(\'product_links\', array($mrbara, \'woocommerce_single_product_summary\') );
}

add_action(\'woocommerce_single_product_summary\', \'remove_products_links\');

结束

相关推荐

Plugins_url()错误地返回wp-Include目录

我怀疑它有问题plugins_url() 但我看到的是一些奇怪的行为。我在激活的插件中有以下内容function include_masonry() { wp_enqueue_script( \'masonry\', plugins_url(\'js/masonry.min.js\', __FILE__), array(), \'3.2.1\', true ); wp_enqueue_script( \'my_init_script\', plugins_url(\'js/my_i