Обновить проблему с update_option () в сочетании с register_setting ()

вступление

У меня есть страница настроек, которая содержит настройку с более сложной функцией обратного вызова для сохранения.

Сохранить данные

Чтобы сохранить данные, я использую функцию register_setting() с настраиваемым обратным вызовом sanitize. Я реализовал его точно так же, как объясняет API настроек WordPress, так что это работает отлично.

Удалить данные из опции

Чтобы удалить данные из этого массива параметров, я использую jQuery в сочетании с функцией обратного вызова AJAX.

Проблема

Проблема в том, что я не могу использовать update_option() (в моем update_option() AJAX), когда register_setting() также активен. Я знаю это, потому что, когда я закомментирую функцию register_setting() , update_option() внезапно работает хорошо, когда он с update_option() register_setting () удаляет этот параметр.

Кто-нибудь имеет опыт работы с этой проблемой и знает, что я могу сделать, чтобы использовать обе функции для обновления опции?

Настройка и настройка регистра

 function gtp_init_theme_options() { $page = 'services-settings-page'; /** * Services settings sections and fields */ $section = 'installing_settings_section'; // Add installation settings section add_settings_section( $section, _x( 'Installing', 'Measure and installing', 'gtp_translate' ), 'gtp_display_installing_settings_section', $page ); // Add and register installation areas $id = 'installing_data'; add_settings_field( $id, __( 'Installing data', 'gtp_translate' ), 'gtp_settings_installing_data_fields', $page, $section, array( 'id' => $id, 'label_for' => $id ) ); register_setting( 'services-theme-settings', $id, 'gtp_register_installing_data_setting' ); } add_action( 'admin_init', 'gtp_init_theme_options' ); 

Отказоустойчивый обратный вызов, вызываемый register_setting ()

 /** * Sanatizes callback for saving installation areas */ function gtp_register_installing_data_setting() { // Initialize object $installing = new Installing(); $error = false; // Check if country isset if ( ! empty( $_POST['existing_country'] ) ) { $country = strtolower( $_POST['existing_country'] ); } elseif ( ! empty( $_POST['country'] ) ) { $country = strtolower( $_POST['country'] ); } else { $error = true; } // Check if zipcode isset if ( ! empty( $_POST['existing_zipcode_area'] ) ) { $range = $_POST['existing_zipcode_area']; } elseif ( ! empty( $_POST['zipcode_from'] ) && ! empty( $_POST['zipcode_to'] ) ) { $range = $_POST['zipcode_from'] . '-' . $_POST['zipcode_to']; } else { $error = true; } // Check if product isset if ( ! empty( $_POST['existing_product'] ) ) { $product = strtolower( $_POST['existing_product'] ); } elseif ( ! empty( $_POST['product'] ) ) { $product = strtolower( $_POST['product'] ); } else { $error = true; } // Check if price isset if ( ! empty( $_POST['price'] ) ) { $price = str_replace( ',', '.', $_POST['price'] ); } else { $error = true; } // No errors if ( ! $error ) { // Add row to data array $installing->addRow( $country, $range, $product, $price ); // Return data array return $installing->getData(); } } 

Функция обратного вызова AJAX

 /** * Remove installing data in admin AJAX handle */ function gtp_remove_installing_data() { // Initialize object $installing = new Installing(); // Remove product if ( ! empty( $_POST['country'] ) && ! empty( $_POST['zipcode_area'] ) && ! empty( $_POST['product'] ) ) { $installing->removeRow( $_POST['country'], $_POST['zipcode_area'], $_POST['product'] ); } // Remove zipcode area elseif ( ! empty( $_POST['country'] ) && ! empty( $_POST['zipcode_area'] ) ) { $installing->removeRow( $_POST['country'], $_POST['zipcode_area'] ); } // Remove country elseif ( ! empty( $_POST['country'] ) ) { $installing->removeRow( $_POST['country'] ); } // Update $installing->update(); die; } add_action( 'wp_ajax_remove_installing_data', 'gtp_remove_installing_data' ); add_action( 'wp_ajax_nopriv_remove_installing_data', 'gtp_remove_installing_data' ); 

Я приложил изображение экрана настроек для вашего воображения, к какому проекту я работаю.

введите описание изображения здесь

Solutions Collecting From Web of "Обновить проблему с update_option () в сочетании с register_setting ()"

Обратите внимание, что происходит, когда вы предоставляете дезинфицировать обратный вызов в register_setting() . Он регистрирует фильтр для дезинфекции ваших опций

 add_filter( "sanitize_option_{$option_name}", $sanitize_callback ); 

Теперь, когда вы выполняете update_option() свою собственную функцию, чтобы предотвратить сохранение: D

Поскольку update_option() вызывает $value = sanitize_option( $option, $value );

Решение: Удалите обратный вызов update_option() перед вызовом update_option() .

 function gtp_remove_installing_data() { //Your code //Remove sanitizing for adding remove_filter( "sanitize_option_installing_data", 'gtp_register_installing_data_setting' ); // Update $installing->update(); die; } 

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

Если вы определили свои крючки wp_ajax_remove_installing_data и wp_ajax_nopriv_remove_installing_data в своем плагине и подключили этот плагин обычным способом в WP с помощью hook init , это означает, что этот код выполняется до register_setting , который вы подключаете к admin_init , который находится позже в очереди .

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

Решение заключалось бы в очистке кеша после обновления опции или в том, чтобы зацепить register_setting в init и убедиться, что он имеет более высокий приоритет, чем ваша функция обновления, поэтому последняя выполняется после вызова register_setting . Отказ от ответственности: Я не пробовал это.