Thomas S Iversen Thomas S Iversen - 3 years ago 137
PHP Question

remove_action From PHP Class in WooCommerce Memberships

I have previously used a solution described here: remove_action From PHP Class for removing an action in the WooCommerce membership plugin.

However, the solution no longer works, as WooComemerce have changed the code behind the membership plugin.

So this is the new code.

Main woocommerce-memberships.php

public function includes() {

// load post types
require_once( $this->get_plugin_path() . '/includes/class-wc-memberships-post-types.php' );

// load user messages helper
require_once( $this->get_plugin_path() . '/includes/class-wc-memberships-user-messages.php' );

// load helper functions
require_once( $this->get_plugin_path() . '/includes/functions/wc-memberships-functions.php' );

// init general classes
$this->rules = $this->load_class( '/includes/class-wc-memberships-rules.php', 'WC_Memberships_Rules' );
$this->plans = $this->load_class( '/includes/class-wc-memberships-membership-plans.php', 'WC_Memberships_Membership_Plans' );
$this->emails = $this->load_class( '/includes/class-wc-memberships-emails.php', 'WC_Memberships_Emails' );
$this->user_memberships = $this->load_class( '/includes/class-wc-memberships-user-memberships.php', 'WC_Memberships_User_Memberships' );
$this->capabilities = $this->load_class( '/includes/class-wc-memberships-capabilities.php', 'WC_Memberships_Capabilities' );
$this->member_discounts = $this->load_class( '/includes/class-wc-memberships-member-discounts.php', 'WC_Memberships_Member_Discounts' );
$this->restrictions = $this->load_class( '/includes/class-wc-memberships-restrictions.php', 'WC_Memberships_Restrictions' );


Main instance

function wc_memberships() {
return WC_Memberships::instance();
}


From included class-wc-memberships-restrictions.php file

/**
* Returns the general content restrictions handler.
*
* @since 1.9.0
*
* @return null|\WC_Memberships_Posts_Restrictions
*/
public function get_posts_restrictions_instance() {

if ( ! $this->posts_restrictions instanceof WC_Memberships_Posts_Restrictions ) {
$this->posts_restrictions = wc_memberships()->load_class( '/includes/frontend/class-wc-memberships-posts-restrictions.php', 'WC_Memberships_Posts_Restrictions' );
}

return $this->posts_restrictions;
}


Then in class-wc-memberships-posts-restrictions.php

public function __construct() {

// decide whether attempting to access restricted content has to be redirected
add_action( 'wp', array( $this, 'handle_restriction_modes' ) );

// restrict the post by filtering the post object and replacing the content with a message and maybe excerpt
add_action( 'the_post', array( $this, 'restrict_post' ), 0 );


How do i remove the 'the_post' action?

So far i have the following in functions.php theme file:

function weteach_remove_actions(){
if(is_singular( 'post' )) {
if( function_exists( 'wc_memberships' ) ){
remove_action( 'the_post', array( wc_memberships()->restrictions, 'restrict_post' ));
}
}
return;
}
add_action( 'the_post', 'weteach_remove_actions', 1 );


Which gives me a "blank-page"-error.

Answer Source

Could you tell us what the error message was? My guess is that restrictions and post_restrictions aren't the same property and so you aren't finding the restrict_post method in the right class.

Edited now that I have looked at Memberships, this seems to work for me:

function so_41431558_remove_membership_post_restrictions(){ 
    if( function_exists( 'wc_memberships' ) && version_compare( WC_Memberships::VERSION, '1.9.0', '>=' ) && is_singular( 'post' ) ){
        remove_action( 'the_post', array( wc_memberships()->get_restrictions_instance()->get_posts_restrictions_instance(), 'restrict_post' ), 0 );
    }
}
add_action( 'wp_head', 'so_41431558_remove_membership_post_restrictions', 1 );

Your add_action attempt is happening on priority 1, which is after the function has already run the Memberships method on priority 0, so even if the rest of your code was correct it would be too late.

So 1. I think we need to go to an earlier hook.

And 2. I think we need to use the new method for accessing the post restrictions class instance.

edited to add

and 3. I've switched to a direct version compare condition

and 4. I misread where the get_posts_restrictions_instance() method was... it is accessed via wc_memberships()->get_restrictions_instance()->get_posts_restrictions_instance()

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download