我正在尝试为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
}
我承认我是使用钩子和过滤器的新手。我想根据函数中的变量禁用/启用该操作。我怎么能用另一个钩子/过滤器呢?
谢谢。
答案 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
中的更多数据的东西。
如何维护所有父类的变量,函数,钩子和放大器?过滤器等进入子类?