Может ли обратный вызов действия предотвратить продолжение продолжения родительского контроля?

Я работаю над плагином, который взаимодействует с Gravity Forms, и при определенных условиях я хочу, чтобы форма не удалялась. Вот метод в Gravity Forms, который обрабатывает удаление формы:

public static function delete_form($form_id){ global $wpdb; if(!GFCommon::current_user_can_any("gravityforms_delete_forms")) die(__("You don't have adequate permission to delete forms.", "gravityforms")); do_action("gform_before_delete_form", $form_id); $form_meta_table = self::get_meta_table_name(); $form_table = self::get_form_table_name(); //Deleting form Entries self::delete_leads_by_form($form_id); //Delete form meta $sql = $wpdb->prepare("DELETE FROM $form_meta_table WHERE form_id=%d", $form_id); $wpdb->query($sql); //Deleting form Views self::delete_views($form_id); //Delete form $sql = $wpdb->prepare("DELETE FROM $form_table WHERE id=%d", $form_id); $wpdb->query($sql); do_action("gform_after_delete_form", $form_id); } 

Можно ли подключиться к gform_before_delete_form а затем сделать что-то, чтобы сделать delete_form () возвратом в этот момент без продолжения? например,

 public function preventGravityFormDeletion() { if( $someCondition ) { // do something that forces delete_form() to stop } } add_action( 'gform_before_delete_form', array( $this, 'preventGravityFormDeletion' ) ); 

Я знаю, что могу называть wp_die() и просто останавливать все, но это не очень элегантно. Есть ли способ лучше? Это не представляется возможным из-за ограничений сферы действия, но я хотел проверить, есть ли какая-то магия WP / PHP, о которой я не знаю.

Solutions Collecting From Web of "Может ли обратный вызов действия предотвратить продолжение продолжения родительского контроля?"

Короткий ответ: нет.

Длинный ответ: тоже нет. Действия не работают.

Редактировать:

Чтобы разработать и сделать ваш вопрос полностью общим:

 function foo() { bar(); return 1; } function bar() { // stuff } 

Нет ничего, что можно было бы добавить в материал, который предотвратит вызов функции foo() из возврата 1, за исключением того, что выполнение сценария полностью прекращается с помощью die или exit.

Примечание: исключение броска тоже не поможет, потому что это имеет тот же эффект, что и остановка выполнения скрипта, если только какой-либо предыдущий вызывающий элемент не улавливает исключение.

Теперь, если эта функция находится где-то в каком-то классе, вы можете определить ее подкласс и заменить эту функцию на свой собственный, а затем потенциально использовать, тем самым изменив способ работы этой функции. Это самое лучшее, что вы можете сделать, поскольку PHP не имеет в нем каких-либо механизмов аспектно-ориентированного программирования, которые позволят вам изменить поведение функции во время выполнения.

Креативным решением было бы изменить фактический form_id в базе данных во время gform_before_delete_form, чтобы ни одно из последующих действий не изменило форму.

Затем вы можете подключиться к gform_after_delete_form и изменить form_id обратно.

gform_before_delete_form

 form_id = form_id + 1000000 

gform_after_delete_form

 form_id = form_id - 1000000 

(при условии, что у вас меньше миллиона форм!)

примерный код:

 public function preventGravityFormDeletion() { if( $someCondition ) { global $wpdb; $temp_form_id = 1000000+$form_id; $sql = $wpdb->prepare("UPDATE $form_meta_table SET form_id = $temp_form_id WHERE form_id=$form_id"); $wpdb->query($sql); $sql = $wpdb->prepare("UPDATE $form_table SET id = $temp_form_id WHERE id=$form_id"); $wpdb->query($sql); } } add_action( 'gform_before_delete_form', array( $this, 'preventGravityFormDeletion' ) );