Вопрос или проблема
Пытаюсь сохранить некоторые данные плагина в wpdb, используя метод update_option
. Этот код отлично работает для одного значения ad_url
, но не удается для моего массива exclude_posts
. Данные POST в панели разработчика Chrome показывают, что exclude_posts[]
получает значение 5, но в wpdb ничего не попадает.
options.php
<form method="post" action="options.php">
<?php
settings_fields('insert-video-ad-settings');
do_settings_sections('insert-video-ad-settings');
?>
<input id=adurl type="textarea" name="ad_url" autocomplete="off" value="<?php
echo get_option('ad_url');
?>"/>
<?php
if(isset($_POST['exclude_posts'])) {
$exclude_posts = $_POST['exclude_posts'];
}
if( isset( $exclude_posts ) )
{
update_option( 'exclude_posts', $exclude_posts );
}
else
{
delete_option( 'exclude_posts' );
}
?>
<select id="exclude_posts" name="exclude_posts[]" multiple="multiple">
<?php
$postslist = get_posts(array(
'order' => 'ASC',
'orderby' => 'date'
));
$exclude = get_option('exclude_posts');
If(!$exclude){
$exclude=array();
}
if ($postslist) {
global $post;
foreach ($postslist as $post)
{
?>
<option value="<?php echo $post->ID; ?>" <?php echo ( in_array( $post->ID, $exclude ) ? 'selected' : '' ); ?> >
<?php echo $post->post_title; ?>
</option>
<?php
}
}
?>
</select>
myplugin.php
add_action('admin_init', 'update_ad_url');
if (!function_exists("update_ad_url")) {
function update_ad_url()
{
register_setting('insert-video-ad-settings', 'ad_url');
}
}
add_action('admin_init', 'update_exclude_posts');
if (!function_exists("update_exclude_posts")) {
function update_exclude_posts()
{
register_setting('insert-video-ad-settings', 'exclude_posts');
}
}
Если $_POST['exclude_posts']
является массивом, но вам нужно сохранить его как строку, вы всегда можете использовать функцию serialize()
и unserialize()
, чтобы преобразовать его в строку и наоборот.
Ответ или решение
Сохранение мультиячеек ввода, используя функцию update_option
в WordPress, требует понимания работы с массивами данных и их хранением в базе данных через опции. В данной ситуации, вы столкнулись с проблемой сохранения массива данных exclude_posts[]
в wpdb, в то время как сохранение одноэлементного значения ad_url
работает корректно.
Теория
update_option
позволяет сохранять значение в базе данных WordPress и ориентирована на работу как с одиночными, так и с множественными значениями. Механизм функционирования обновления данных через update_option
предельно прост: передается ключ, под которым будет храниться значение, и само значение (в данном случае массив данных). Однако, при хранении массивов, необходимо учитывать формат хранения и запросов.
Для передачи и хранения массивов данных в базе данных, в PHP используются функции serialize()
и unserialize()
, которые преобразуют массив в строку и обратно. Это необходимо, поскольку многие базы данных не поддерживают нативное хранение сложных структур данных, таких как массивы JSON.
Пример
Рассмотрим пример:
-
Форматирование данных для сохранения. При получении массива через POST-запрос, он должен быть сериализован перед сохранением:
if(isset($_POST['exclude_posts'])) { $exclude_posts = $_POST['exclude_posts']; $exclude_posts_serialized = serialize($exclude_posts); update_option('exclude_posts', $exclude_posts_serialized); }
-
Чтение и использование данных. При выводе данных из базы нужно реализовать их десериализацию:
$exclude = get_option('exclude_posts'); $exclude = $exclude ? unserialize($exclude) : array();
-
Регистрация настройки. Убедитесь в правильной регистрации опций с использованием
register_setting
в нужных обработчикахadmin_init
:add_action('admin_init', 'update_plugin_settings'); function update_plugin_settings() { register_setting('insert-video-ad-settings', 'ad_url'); register_setting('insert-video-ad-settings', 'exclude_posts'); }
Применение
Теперь применим полученные теоретические знания на практике, чтобы устранить возникшую проблему. Основное внимание на использование сериализации массива при сохранении и десериализации при отображении.
-
В коде сохранения: Обеспечьте, чтобы входные данные передавались в сериализованной форме:
if(isset($_POST['exclude_posts'])) { $exclude_posts = $_POST['exclude_posts']; update_option('exclude_posts', serialize($exclude_posts)); } else { delete_option('exclude_posts'); }
-
При получении и использовании данных: Разберите сериализованные данные перед применением:
$exclude = get_option('exclude_posts'); if($exclude) { $exclude = unserialize($exclude); } else { $exclude = array(); }
-
Результаты: В результате осуществления этих шагов данные массива будут корректно сохраняться в таблице wp_options и готовы к использованию в нужной области. Это обеспечит корректную работу функционала исключения постов из списка.
Дополнительно, всегда не забудьте делать проверку значений после десериализации на случай ошибок или пустых значений. Этот метод также способствует улучшению работы вашего плагина за счет надёжного хранения и извлечения данных.
Таким образом, внедрение сериализации позволит вашему коду корректно работать с массивами, и вы сможете надёжно сохранять и использовать массивы, такие как exclude_posts
, при разработке плагинов для WordPress.