修改WordPress插件中的现有类方法/函数

时间:2016-05-21 01:09:13

标签: php wordpress

想要更改类中函数的简单字符串。更具体地说,我只想将最后一个函数中的“%s”更改为硬编码的URL,例如“https://whatever.com”。

class WPJMCL_Claim_Free {

    public function __construct() {
        add_action( 'template_redirect', array( $this, 'create_claim' ) );
        add_action( 'template_redirect', array( $this, 'display_guest_notice' ) ); // I WANT TO CHANGE THIS ONE
    }

    public function create_claim() {
        // CODE I DON'T CARE ABOUT
    }


    public function display_guest_notice() {
        if ( ! isset( $_GET[ 'action' ] ) || 'claim_as_guest' != $_GET[ 'action' ] ) {
            return;
        }

        if ( ! isset( $_GET[ 'listing_id' ] ) ) {
            return;
        }

        $listing_id = absint( $_GET[ 'listing_id' ] );

        // Add a notice if the theme is using WC
        if ( defined( 'WC_VERSION' ) ) {
            wc_add_notice( sprintf( __( 'Please <a href="%s">log in</a> to claim this listing.', 'wp-job-manager-claim-listing' ), wp_login_url( get_permalink( $listing_id ) ) ) );
        }

        do_action( 'wpjmcl_guest_claim_redirect', $listing_id );
    }

}

我已经尝试将该类扩展为一个单独的plugin.php文件,但我希望输出两次,一次作为原始类输出,另一次作为我的。

我的扩展名:

add_action('init', 'claim_redirect_mods_loader', 0);

function claim_redirect_mods_loader() {

if( class_exists( 'WPJMCL_Claim_Free' )){

    class my_WPJMCL_Claim_Free extends WPJMCL_Claim_Free {

        public function __construct() {
            add_action( 'template_redirect', array( $this, 'display_guest_notice' ) );
        }

        public function display_guest_notice() {
            if ( ! isset( $_GET[ 'action' ] ) || 'claim_as_guest' != $_GET[ 'action' ] ) {
                return;
            }

            if ( ! isset( $_GET[ 'listing_id' ] ) ) {
                return;
            }

            $listing_id = absint( $_GET[ 'listing_id' ] );

            // Add a notice if the theme is using WC
            if ( defined( 'WC_VERSION' ) ) {
                wc_add_notice( sprintf( __( 'Please <a href="https://directory.supportpay.com/my-account/">log in or register</a> to claim this listing.', 'wp-job-manager-claim-listing' ), wp_login_url( get_permalink( $listing_id ) ) ) );
            }
            do_action( 'wpjmcl_guest_claim_redirect', $listing_id );
        }

    } // End Class

    new my_WPJMCL_Claim_Free();

} // End if

}

而不是扩展类,我想只修改原始类中的原始函数,但不确定我的过滤器在语法上是否正确(在我的functions.php文件中):

global $WPJMCL_Claim_Free;

function my_display_guest_notice(){

  if ( ! isset( $_GET[ 'action' ] ) || 'claim_as_guest' != $_GET[ 'action' ] ) {
            return;
  }

  if ( ! isset( $_GET[ 'listing_id' ] ) ) {
      return;
  }

  $listing_id = absint( $_GET[ 'listing_id' ] );

  // Add a notice if the theme is using WC
  if ( defined( 'WC_VERSION' ) ) {
      wc_add_notice( sprintf( __( 'Please <a href="https://directory.supportpay.com/my-account/">log in or register</a> to claim this listing.', 'wp-job-manager-claim-listing' ), wp_login_url( get_permalink( $listing_id ) ) ) );
  }

  do_action( 'wpjmcl_guest_claim_redirect', $listing_id );  
}

add_filter('display_guest_notice', array( $WPJMCL_Claim_Free, 'my_display_guest_notice'), 999 );

我是否应该覆盖原始功能和/或我的方法是否正确?

1 个答案:

答案 0 :(得分:0)

此处的一个选项是添加过滤器而无需修改任何代码。

add_filter( 'woocommerce_add_success', 'your_function_name' );
function your_function_name($message) {
     $string_to_search = ' to claim this listing.';
     if( FALSE === strpos( $message, $string_to_search) ) {
          return $message;
     }

     return 'Please <a href="https://directory.supportpay.com/my-account/">log in or register</a> to claim this listing.';
}

您可以根据要使其生效的页面添加if语句,从而进一步提高准确性。

此外,在您的两次尝试中,sprintf语法都不正确。

你原来的:

wc_add_notice( sprintf( __( 'Please <a href="https://directory.supportpay.com/my-account/">log in or register</a> to claim this listing.', 'wp-job-manager-claim-listing' ), wp_login_url( get_permalink( $listing_id ) ) ) );

应该是:

wc_add_notice( sprintf( __( 'Please <a href="%s">log in</a> to claim this listing.', 'wp-job-manager-claim-listing' ), "https://directory.supportpay.com/my-account/" ) );