试图扩展Wordpress插件,需要挂钩函数

时间:2015-12-02 01:20:22

标签: wordpress plugins filter action hook

我正在尝试为Wordpress插件Appointments +添加一些特定于站点的功能。当用户进行预约时,他们会选择某些服务并在某些字段中输入信息以进行确认。

我想要做的是添加一些代码,以便额外的信息字段与他们选择的服务相关。例如,如果他们选择服务A,他们必须填写一些信息并验证这些字段。但如果他们选择服务B,则隐藏字段并跳过验证。

以下是原始代码的示例:

    function post_confirmation() {
           ...some extra stuff

        $values = explode( ":", $_POST["value"] );
        $location = $values[0];
        $service = $values[1];

        do_action('app-additional_fields-validate');

          ...more stuff

        }

这是我想要做的事情,但不能改变这个原始的插件文件:

    function post_confirmation() {
           ...some extra stuff

        $values = explode( ":", $_POST["value"] );
        $location = $values[0];
        $service = $values[1];

        if (($service == 1) || ($service == 3)) {
            do_action('app-additional_fields-validate');
        }

          ...more stuff

        }

我承认我是使用钩子和过滤器的新手。我想根据函数中的变量禁用/启用该操作。我怎么能用另一个钩子/过滤器呢?

谢谢。

2 个答案:

答案 0 :(得分:0)

取消用于调用post_confirmation的钩子,并从functions.php覆盖此函数,如

remove_action( 'current_action_hook', 'post_confirmation' );

add_action( 'current_Action_hook', 'post_custom_confirmation' );
function post_custom_confirmation(){
        ...some extra stuff

        $values = explode( ":", $_POST["value"] );
        $location = $values[0];
        $service = $values[1];

        if (($service == 1) || ($service == 3)) {
            do_action('app-additional_fields-validate');
        }

          ...more stuff
}

我认为这应该有用,我在woocommerce插件开发过程中使用了这种方式,然后将近2个月的工作代码示例,这样如果您需要对上面的代码进行任何修改,您可以参考。

remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
add_action( 'woocommerce_checkout_order_review', 'pk_order_review', 10, 1 );
function pk_order_review($template) {

    global $woocommerce;
    $template = wc_get_template ( 'checkout/review-order.php', FALSE, FALSE, untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/templates/');
    return $template;
    exit;
}

另一种方法是

add_action( 'app-additional_fields-validate', 'foo' );
function foo(){
     if (($service == 1) || ($service == 3)) {
           /*  Your stuffs  */
     }
}

答案 1 :(得分:0)

这实际上是部分答案,是一个新问题。如果可以做到这一点。

所以,我终于找到了影响所需功能的方法。

我试图修改的函数包含在一个类中,所以我做了类似的事情:

class my_Check extends Appointments {

   function __construct() {
      $this->unregister_parent_hook();
      add_action( 'wp_ajax_post_confirmation', array( $this, 'post_confirmation' ) );
      add_action( 'wp_ajax_nopriv_post_confirmation', array( $this, 'post_confirmation' ) );
   }

   function unregister_parent_hook() {
      global $appointments;  //this was the object created with the parent class
      remove_action( 'wp_ajax_post_confirmation', array( $appointments, 'post_confirmation' ) );
      remove_action( 'wp_ajax_nopriv_post_confirmation', array( $appointments, 'post_confirmation' ) );
   }

   function post_confirmation() {

        ...do the stuff with my mods...

   }
}

$new_Check = new my_Check();

只是,我现在有一个新问题。父类在__construct()中做了很多(很多'add_action()'等等)。而$这是填充了更多的数据。问题是,这些其他的东西和数据似乎没有延续到子类中。我尝试在孩子的parent::__construct()函数中添加__construct(),但这似乎不起作用。

我的mods的代码工作,除了需要从父类继承的$this中的更多数据的东西。

如何维护所有父类的变量,函数,钩子和放大器?过滤器等进入子类?