Необходимо было добавить произвольное поле публикации с помощью 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
);