remove_action From PHP Class in WooCommerce Member

2019-07-19 15:47发布

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.

1条回答
一纸荒年 Trace。
2楼-- · 2019-07-19 16:28

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

查看更多
登录 后发表回答