Question: remove_action From PHP Class


remove_action From PHP Class

Answers 1
Added at 2017-01-02 19:01

I'm attempting to remove an action and add it with a different priority. Below are all the code snippets that assist in generating a Message:

Include required frontend files

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' );


    $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' );

Get the product purchasing restricted message

 * @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 );

Restriction class, handles content restriction on frontend

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 );

I literally just need to alter the priority to 15 from 30 in the action of the WC_Memberships_Restrictions class. The issue is that there's no clear way to call the removal. Any suggestions?

nr: #1 dodano: 2017-01-02 21:01

Well the code you provided shows that the instance of the WC_Memberships_Restrictions class is stored in the main class' restrictions property.

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

From there I just had to look up how to access the instance of the main Membership class, from the bottom of the main plugin file you see:

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

This means that now to access the instance of the restrictions class we need to access the main class's restriction property. While that sounds clear as mud, basically it means this:


Knowing this, we can known remove and add actions from that class:

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 );
Source Show
◀ Wstecz