来自PHP类

时间:2017-01-02 18:18:58

标签: php wordpress woocommerce hook-woocommerce

我正在尝试删除操作并使用不同的优先级添加它。 以下是有助于生成消息的所有代码片段:

包含所需的前端文件

private function frontend_includes() {

    require_once( $this->get_plugin_path() . '/includes/wc-memberships-template-functions.php' );
    require_once( $this->get_plugin_path() . '/includes/class-wc-memberships-shortcodes.php' );

    WC_Memberships_Shortcodes::initialize();

    $this->frontend     = $this->load_class( '/includes/frontend/class-wc-memberships-frontend.php', 'WC_Memberships_Frontend' );
    $this->checkout     = $this->load_class( '/includes/frontend/class-wc-memberships-checkout.php', 'WC_Memberships_Checkout' );
    $this->restrictions = $this->load_class( '/includes/frontend/class-wc-memberships-restrictions.php', 'WC_Memberships_Restrictions' );
}

获取产品购买限制消息

 /**
 * @param int $post_id Optional. Defaults to current post.
 * @return string
 */
public function get_product_purchasing_restricted_message( $post_id = null ) {

    if ( ! $post_id ) {

        global $post;
        $post_id = $post->ID;
    }

    $products = $this->get_products_that_grant_access( $post_id );
    $message  = $this->get_restriction_message( 'product_purchasing_restricted', $post_id, $products );

    /**
     * Filter the product purchasing restricted message
     *
     * @since 1.0.0
     * @param string $message The restriction message
     * @param int $product_id ID of the product being restricted
     * @param array $products Array of product IDs that grant access to this product
     */
    return apply_filters( 'wc_memberships_product_purchasing_restricted_message', $message, $post_id, $products );
}

限制类,处理前端的内容限制

class WC_Memberships_Restrictions {


/** @var array associative array of content conditions for current user **/
private $user_content_access_conditions;

/** @var array of post IDs that content restriction has been applied to **/
private $content_restriction_applied = array();

/** @var string Product content restriction password helper **/
private $product_restriction_password = null;

/** @var bool Product thumbnail removed helper **/
private $product_thumbnail_restricted = false;


public function __construct() {
    // Desired action to remove and re-prioritize
    add_action( 'woocommerce_single_product_summary', array( $this, 'single_product_purchasing_restricted_message' ), 30 );
}
}

我确实需要在WC_Memberships_Restrictions类的操作中将优先级从30改为15。问题在于没有明确的方法来调用删除。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您提供的代码表明WC_Memberships_Restrictions类的实例存储在主类“restrictions属性中。

$this->restrictions = $this->load_class( '/includes/frontend/class-wc-memberships-restrictions.php', 'WC_Memberships_Restrictions' );

从那里我只需要查看如何从您看到的主插件文件的底部访问主要Membership类的实例:

/**
 * Returns the One True Instance of Memberships
 *
 * @since 1.0.0
 * @return WC_Memberships
 */
function wc_memberships() {
    return WC_Memberships::instance();
}

这意味着现在要访问限制类的实例,我们需要访问主类的restriction属性。虽然这听起来像泥,但基本上它意味着:

wc_memberships()->restrictions

了解这一点,我们可以知道从该类删除并添加操作:

function so_41431558_change_hook_priority(){
    if( function_exists( 'wc_memberships' ) ){
        remove_action( 'woocommerce_single_product_summary', array( wc_memberships()->restrictions, 'single_product_purchasing_restricted_message' ), 30 );
        add_action( 'woocommerce_single_product_summary', array( wc_memberships()->restrictions, 'single_product_purchasing_restricted_message' ), 15 );
    }
}
add_action( 'woocommerce_single_product_summary', 'so_41431558_change_hook_priority', 1 );