Необходимо было добавить произвольное поле публикации с помощью rcl_public_form_fields, но при сохранении значения не сохраняются. Создание дефолтного поля не подходит, так как передаю свою переменную в массив values.
Андрей кажется упоминал недавно, что функция в бете, может возможно все же заставить ее работать?
Тестировал все с кодом, что брал из примера
:
add_filter('rcl_public_form_fields','add_custom_field_public_form',10,2); function add_custom_field_public_form($fields,$form){ //добавляем проверку на нужный тип записи в форме публикации //которой будем выводить наше поле if($form->post_type != 'post') return $fields; $fields[] = array( 'type' => 'text', 'slug' => 'my-text-field', 'title' => 'Заголовок текстового поля', 'notice' => 'напишите что то в текстовом поле' ); $fields[] = array( 'type' => 'checkbox', 'slug' => 'my-checkbox-field', 'title' => 'Заголовок поля', 'notice' => 'укажите одно из значений нашего поля', 'values' => array( 'первое значение', 'второе значение', 'третье значение' ) ); return $fields; }
этот функционал работает нормально, надо только понимать разницу между полями добавленными через админку (это касается и дефолтных полей) и полями добавленными кастомно, про первые плагин знает, про вторые - нет. Поэтому данные с первых полей сохраняются автоматически, а для вторых надо написать свой обработчик, который должен срабатывать при сохрании данных публикации, например:
add_action('update_post_rcl','my_update_custom_meta',10,3); function my_update_custom_meta($post_id, $postdata, $update){ if($postdata['post_type'] != 'post') return false; update_post_meta($post_id, 'meta-key-1', $_POST['meta-key-1']); if($_POST['meta-key-2']) update_post_meta($post_id, 'meta-key-2', $_POST['meta-key-2']); else delete_post_meta($post_id, 'meta-key-2'); }
Полностью протестировал, у меня обработчик не корректно сохраняет множественные значения произвольного поля. Кажется, сохраняются просто порядковые числа в массиве, а не сами значения. Мой код:
add_filter('rcl_public_form_fields','add_custom_field_public_form',10,2); function add_custom_field_public_form($fields,$form){ if($form->post_type != 'products') return $fields; $fields[] = array( 'type' => 'multiselect', 'slug' => 'my_meta_1', 'title' => 'Заголовок поля', 'notice' => 'укажите одно из значений нашего поля', 'values' => array( 'первое значение', 'второе значение', 'третье значение' ) ); return $fields; } add_action('update_post_rcl','my_update_product_field',10,2); function my_update_product_field($post_id, $postdata, $update){ if($postdata['post_type'] != 'products') return false; update_post_meta($post_id, 'my_meta_1', $_POST['my_meta_1']); }
Что я не правильно делаю? Для служит переменная $update, может в ней дело?
все верно, сохраняются значения ключей, а не их наименований, если вам надо, чтобы сохранялись именно строковые значения, а не ключи массива, то продублируйте их в ключах:
'values' => array( 'первое значение'=>'первое значение', 'второе значение'=>'второе значение', 'третье значение'=>'третье значение' )
или укажите в массиве поля опцию 'value_in_key' и ключи массива 'values' будут заменены на значения
$fields[] = array( 'type' => 'multiselect', 'slug' => 'my_meta_1', 'title' => 'Заголовок поля', 'notice' => 'укажите одно из значений нашего поля', 'value_in_key' => true, 'values' => array( 'первое значение', 'второе значение', 'третье значение' ) );
Спасибо за объяснение! Разрешите еще вопрос с небольшим отклонением от темы. Возможно ли передать в values массив: ID пользователя как ключ, а в качестве значения логин. Что бы в результате поучить в произвольном поле публикации возможность выбора пользователей.
Приходит на ум примерно такое, но вариант не рабочий. Получаем данные выборки пользователей:
$users = get_users( array( 'meta_key' => 'user_meta_1', 'fields' => array( 'ID','user_login') ) );
Передаем их:
$fields[] = array( 'type' => 'multiselect', 'slug' => 'my_meta_1', 'title' => 'Заголовок поля', 'notice' => 'укажите одно из значений нашего поля', //'value_in_key' => true, 'values' => $users );