需要帮助从插件文件中删除操作

时间:2014-08-18 04:30:10

标签: php wordpress

您好我正在尝试从wordpress插件文件中删除操作。该插件名为Woocommerce Points and Rewards。我找到了我要在其中一个类文件中删除的操作。当我注释掉" add_action"它完全符合我的要求。但我试图从我的孩子们的functions.php中删除动作。我一直在读这个,我认为我的问题是我需要全球化"动作所在的类变量;但我不确定那个类变量是什么......

这里是添加操作的代码(文件的一部分):

class WC_Points_Rewards_Cart_Checkout {


/**
 * Add cart/checkout related hooks / filters
 *
 * @since 1.0
 */
public function __construct() {

    // Coupon display
    add_filter( 'woocommerce_cart_totals_coupon_label', array( $this, 'coupon_label' )      );
    // Coupon loading
    add_action( 'woocommerce_cart_loaded_from_session', array( $this, 'points_last' ) );
    add_action( 'woocommerce_applied_coupon', array( $this, 'points_last' ) );

    // add earn points/redeem points message above cart / checkout
    add_action( 'woocommerce_before_cart', array( $this, 'render_earn_points_message' ), 15 );

    add_action( 'woocommerce_before_cart', array( $this, 'render_redeem_points_message' ), 16 );

    add_action( 'woocommerce_before_checkout_form', array( $this, 'render_earn_points_message' ), 5 );
    add_action( 'woocommerce_before_checkout_form', array( $this, 'render_redeem_points_message' ), 6 );

    // handle the apply discount submit on the cart page
    add_action( 'wp', array( $this, 'maybe_apply_discount' ) );

    // handle the apply discount AJAX submit on the checkout page
    add_action( 'wp_ajax_wc_points_rewards_apply_discount', array( $this, 'ajax_maybe_apply_discount' ) );
}

我要删除的功能就是这个:

add_action( 'woocommerce_before_cart', array( $this, 'render_redeem_points_message' ), 16 );
到目前为止,没有把它取下来的运气;这是我在functions.php中的内容:

global $woocommerce, $wc_points_rewards;

/*
global $this;
*/

remove_action( 'woocommerce_before_cart', array( $this, 'render_redeem_points_message' ), 16 );

所以 - 我确信这可以通过这种方式完成,至少我已经读过它可以完成,我想我在这方面有些不对劲......

我尝试全球化$ this,但这只是给了我一条错误消息......

如果您需要查看整个文件或其他内容,请告诉我们......

所以我希望这里有人可以帮我识别我做错了什么......

**周一8月18日更新******** 寻找实例化类的位置;我在" woo commerce-points-and-rewards.php"中找到了这个。文件;看起来这可能是它但不确定我在看什么;

  1. 这看起来像" WC_Points_Rewards_Cart_Checkout"实例化?

  2. 如果是这样,我不知道如何使用它来编写我的"删除操作"在functions.php中......

    私人功能包括(){

    // product class
    require( 'classes/class-wc-points-rewards-product.php' );
    $this->product = new WC_Points_Rewards_Product();
    
    // cart / checkout class
    require( 'classes/class-wc-points-rewards-cart-checkout.php' );
    $this->cart = new WC_Points_Rewards_Cart_Checkout();
    
    // order class
    require( 'classes/class-wc-points-rewards-order.php' );
    $this->order = new WC_Points_Rewards_Order();
    
    // discount class
    require( 'classes/class-wc-points-rewards-discount.php' );
    $this->discount = new WC_Points_Rewards_Discount();
    
    // actions class
    require( 'classes/class-wc-points-rewards-actions.php' );
    $this->actions = new WC_Points_Rewards_Actions();
    
    // manager class
    require( 'classes/class-wc-points-rewards-manager.php' );
    
    // points log access class
    require( 'classes/class-wc-points-rewards-points-log.php' );
    
    if ( is_admin() )
        $this->admin_includes();
    }
    
  3. 非常感谢...

6 个答案:

答案 0 :(得分:0)

试试这个:

// Use the class name instead of a globalized $this
remove_action( 'woocommerce_before_cart', array( 'WC_Points_Rewards_Cart_Checkout', 'render_redeem_points_message' ), 16 );

由于$this是其使用的类的内部引荐者,因此全球化可能不是一件好事。

插件是否允许您使用自己的类扩展类并使用它?

答案 1 :(得分:0)

you found a solution for this? having the same problem with another wc plugin ;)

alright. found an answer in the wc docs. in my case:

function wc_move_checkout_addons() {
    remove_action( 'woocommerce_checkout_after_customer_details', array( $GLOBALS['wc_checkout_add_ons']->frontend, 'render_add_ons' ) ); 
    add_action( 'woocommerce_checkout_before_customer_details', array( $GLOBALS['wc_checkout_add_ons']->frontend, 'render_add_ons' ) );
}
add_action( 'init', 'wc_move_checkout_addons' );

so in your case it should be something like that:

function wc_remove_message() {
    remove_action( 'woocommerce_before_cart', array( $GLOBALS['wc_points_rewards_cart_checkout']->frontend, 'render_redeem_points_message' ) ); 
}
add_action( 'init', 'wc_remove_message' );

答案 2 :(得分:0)

如果其他人想知道,我刚刚以下列方式完成了删除此插件中的操作。

我想删除第34行class-wc-points-rewards.php中定义的操作:

add_action( 'woocommerce_single_product_summary', array( $this, 'render_product_message' ) );

为此,我查看了woocommerce-points-and-rewards.php。在第46行显示:

$GLOBALS['wc_points_rewards'] = new WC_Points_Rewards();

在同一个WC_Points_Rewards类定义文件中,在第249-250行显示:

require( 'includes/class-wc-points-rewards-product.php' );
$this->product = new WC_Points_Rewards_Product();

有了这些信息,我就可以删除操作:

remove_action( 'woocommerce_single_product_summary', array( $GLOBALS['wc_points_rewards']->product, 'render_product_message' ) );

答案 3 :(得分:0)

我能够弄清楚如何使用以下代码有效地删除render_redeem_points_message:

/* Removes render_redeem_points_message() */
function wc_remove_points_message() {
    global $woocommerce;
    global $wc_points_rewards;

    // Removes message from cart page
    remove_action( 'woocommerce_before_cart', array( $wc_points_rewards->cart, 'render_redeem_points_message' ), 16 );

    // Removes message from checkout page
    remove_action( 'woocommerce_before_checkout_form', array( $wc_points_rewards->cart, 'render_redeem_points_message' ), 6 );

}
// Removes action on init
add_action( 'init', 'wc_remove_points_message' );

为了分享更多信息,我想创建一个最低购买金额以兑换积分:

/* Adds Minimum Order for Points Redemption */
function wc_min_order_points_message() {
    global $woocommerce;
    global $wc_points_rewards;

    // Get cart subtotal, excluding tax
    $my_cart_total = $woocommerce->cart->subtotal_ex_tax;

    if ($my_cart_total < 30) { // $30 minimum order

        remove_action( 'woocommerce_before_cart', array( $wc_points_rewards->cart, 'render_redeem_points_message' ), 16 );
        remove_action( 'woocommerce_before_checkout_form', array( $wc_points_rewards->cart, 'render_redeem_points_message' ), 6 );

    } // endif $my_cart_total


}
// Adds action for cart and checkout pages instead of on init
add_action( 'woocommerce_before_cart', 'wc_min_order_points_message' );
add_action( 'woocommerce_before_checkout_form', 'wc_min_order_points_message' );

我希望这可以帮助其他人尝试同样扩展WooCommerce积分和奖励插件。

答案 4 :(得分:0)

<强> SOLUTION-1: 在这种情况下,由于我们有插件对象的全局实例,因此我们可以轻松完成:

remove_action('woocommerce_before_cart',array($GLOBALS['wc_points_rewards']->cart,'render_redeem_points_message'),16);

<强> SOLUTION-2: 如果任何插件作者匿名创建类对象而不将其存储到任何全局变量或者不保留任何可以返回它自己的实例的方法,那么我们将不会像上面的解决方案一样获得类对象的实例。在这些情况下,我们可以使用以下内容:)

//keeping this function in our functions.php
function remove_anonymous_object_action( $tag, $class, $method, $priority=null ){

    if( empty($GLOBALS['wp_filter'][ $tag ]) ){
        return;
    }

    foreach ( $GLOBALS['wp_filter'][ $tag ] as $filterPriority => $filter ){
        if( !($priority===null || $priority==$filterPriority) )
            continue;

        foreach ( $filter as $identifier => $function ){
            if( is_array( $function)
                and is_a( $function['function'][0], $class )
                and $method === $function['function'][1]
            ){
                remove_action(
                    $tag,
                    array ( $function['function'][0], $method ),
                    $filterPriority
                );
            }
        }
    }
}

在我们需要时适当地调用以下行(可能是钩子或其他东西):

//-->Actual Target: this line does not work;
//remove_action( 'personal_options', array('myCRED_Admin','show_my_balance') );

//-->But instead this line will work ;)
remove_anonymous_object_action('personal_options','myCRED_Admin','show_my_balance');

答案 5 :(得分:0)

这个功能对我有用

if (class_exists('WC_Points_Rewards')) {
global $woocommerce, $wc_points_rewards;
   remove_action( 'woocommerce_before_cart', array( $wc_points_rewards->cart, 'render_earn_points_message' ), 15 );     
   remove_action( 'woocommerce_before_cart', array( $wc_points_rewards->cart, 'render_redeem_points_message' ), 16 );
}