【问题标题】:Wordpress - Editing a plugin's filter functionalityWordpress - 编辑插件的过滤器功能
【发布时间】:2016-08-16 20:23:52
【问题描述】:

我想知道是否有人可以帮助我。

我有一个名为 Paid Memberships Pro 的插件。

在注册表单上有一些我想必填的字段。

我浏览了代码,找到了它设置哪些字段是必填和不需要的地方,如下:

//require fields
$pmpro_required_billing_fields = array(
    "bfirstname" => $bfirstname,
    "blastname" => $blastname,
    "baddress1" => $baddress1,
    "bcity" => $bcity,
    "bstate" => $bstate,
    "bzipcode" => $bzipcode,
    "bphone" => $bphone,
    "bcountry" => $bcountry,
    "bemail" => $bemail,
    "CardType" => $CardType,
    "AccountNumber" => $AccountNumber,
    "ExpirationMonth" => $ExpirationMonth,
    "ExpirationYear" => $ExpirationYear,
    "CVV" => $CVV
);
$pmpro_required_billing_fields = apply_filters("pmpro_required_billing_fields", $pmpro_required_billing_fields);
$pmpro_required_user_fields = array(
    "username" => $username,
    "password" => $password,
    "password2" => $password2,
    "bemail" => $bemail,
    "bconfirmemail" => $bconfirmemail
);
$pmpro_required_user_fields = apply_filters("pmpro_required_user_fields", $pmpro_required_user_fields);

这可以在插件核心文件 plugins/paid-memberships-pro/preheaders/checkout.php 之一中找到

我希望能够覆盖它,但我不想编辑核心文件,有没有办法可以通过我的主题 functions.php 文件来编辑它?

例如,将 bfirstname 和 blastname 添加到 $pmpro_required_user_fields?

任何帮助将不胜感激,我一直在寻找如何做到这一点,但我无法真正理解是否可能。

谢谢大家:)

【问题讨论】:

  • 我认为您需要在主题函数中覆盖类或函数

标签: php wordpress field hook membership


【解决方案1】:

(把这段代码放在你的chid主题function.php文件中)

不是舒尔,但你可以先尝试使用remove_filters

remove_filters("pmpro_required_billing_fields", $pmpro_required_billing_fields);
remove_filters("pmpro_required_billing_fields", $pmpro_required_user_fields);

然后您可以克隆这些数组,自定义它们(并稍微更改它们的名称),然后为自定义数组重新应用过滤器:

$pmpro_required_billing_fields2 = array(
    /* your custom code goes here */
);
$pmpro_required_billing_fields2 = apply_filters("pmpro_required_billing_fields", $pmpro_required_billing_fields2);

$pmpro_required_user_fields2 = array(
    /* your custom code goes here */
);
$pmpro_required_user_fields2 = apply_filters("pmpro_required_user_fields", $pmpro_required_user_fields2);

这只是一个未经测试的想法,希望它会奏效。

【讨论】:

    【解决方案2】:

    我发现了一段完美运行的代码

    //make sure address fields are required
    function my_pmpro_required_user_fields($fields)
    {
        global $bfirstname, $blastname, $baddress1, $bcity, $bstate, $bzipcode, $bcountry, $bphone, $bemail;
        $fields["bfirstname"] = $bfirstname;
        $fields["blastname"] = $blastname;
        $fields["baddress1"] = $baddress1;
        $fields["bcity"] = $bcity;
        $fields["bstate"] = $bstate;
        $fields["bzipcode"] = $bzipcode;
        $fields["bphone"] = $bphone;
        $fields["bemail"] = $bemail;
        $fields["bcountry"] = $bcountry;
        return $fields;
    }
    add_action("pmpro_required_user_fields", "my_pmpro_required_user_fields");
    
    /*
     * Save billing fields when using PayPal
     */
    function my_pmpro_paypalexpress_session_vars() {
        $_SESSION['bfirstname'] = $_REQUEST['bfirstname'];
        $_SESSION['blastname'] = $_REQUEST['blastname'];
        $_SESSION['baddress1'] = $_REQUEST['baddress1'];
        $_SESSION['baddress2'] = $_REQUEST['baddress2'];
        $_SESSION['bcity'] = $_REQUEST['bcity'];
        $_SESSION['bstate'] = $_REQUEST['bstate'];
        $_SESSION['bzipcode'] = $_REQUEST['bzipcode'];
        $_SESSION['bphone'] = $_REQUEST['bphone'];
        $_SESSION['bemail'] = $_REQUEST['bemail'];
        $_SESSION['bcountry'] = $_REQUEST['bcountry'];
    }
    add_action('pmpro_paypalexpress_session_vars', 'my_pmpro_paypalexpress_session_vars');
    
    //load vars back into $_REQUEST
    function my_init() {
    if(!empty($_REQUEST['review']) && !empty($_REQUEST['token'])) {
        $_REQUEST['bfirstname'] = $_SESSION['bfirstname'];
        $_REQUEST['blastname'] = $_SESSION['blastname'];
        $_REQUEST['baddress1'] = $_SESSION['baddress1'];
        $_REQUEST['baddress2'] = $_SESSION['baddress2'];
        $_REQUEST['bcity'] = $_SESSION['bcity'];
        $_REQUEST['bstate'] = $_SESSION['bstate'];
        $_REQUEST['bzipcode'] = $_SESSION['bzipcode'];
        $_REQUEST['bphone'] = $_SESSION['bphone'];
        $_REQUEST['bemail'] = $_SESSION['bemail'];
        $_REQUEST['bcountry'] = $_SESSION['bcountry'];
    }
    }
    add_action('init', 'my_init');
    

    【讨论】:

      【解决方案3】:

      如果有人仍然需要这个 - 在这种情况下,最佳做法是使用 pmpro_required_user_fieldspmpro_required_billing_fields 过滤器,具体取决于您希望哪些字段是必需的 - 用户或帐单字段。

      因此,例如,如果您需要一个帐单电话 (bphone) 字段,则可以这样做:

      add_filter( "pmpro_required_billing_fields", 'yourtheme_require_phone' );
      function yourtheme_require_phone($pmpro_required_user_fields) {
      
        global $bphone;
      
        $pmpro_required_user_fields["bphone"] = $bphone;
      
        return $pmpro_required_user_fields;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 2014-11-02
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多