Домой Каталог: Дополнения WP-Recall Public Recall Не сохраняются произвольные поля публикации
8ответ(ов) в теме
Валерий
не в сети 3 года
На сайте с 20.03.2015
Участник
Тем 35
Сообщения 87
1
11:02

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

}

0
Андрей CS
не в сети 24 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16854
2
11:11

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

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');

}

1
Валерий
не в сети 3 года
На сайте с 20.03.2015
Участник
Тем 35
Сообщения 87
3
12:00

Спасибо, все работает!

0
Валерий
не в сети 3 года
На сайте с 20.03.2015
Участник
Тем 35
Сообщения 87
4
19:55

Полностью протестировал, у меня обработчик не корректно сохраняет множественные значения произвольного поля. Кажется, сохраняются просто порядковые числа в массиве, а не сами значения. Мой код:

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, может в ней дело?

0
Андрей CS
не в сети 24 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16854
5
19:59

все верно, сохраняются значения ключей, а не их наименований, если вам надо, чтобы сохранялись именно строковые значения, а не ключи массива, то продублируйте их в ключах:

'values' => array(
            'первое значение'=>'первое значение',
            'второе значение'=>'второе значение',
            'третье значение'=>'третье значение'
        )

или укажите в массиве поля опцию 'value_in_key' и ключи массива 'values' будут заменены на значения

$fields[] = array(
        'type' => 'multiselect',
        'slug' => 'my_meta_1',
        'title' => 'Заголовок поля',
        'notice' => 'укажите одно из значений нашего поля',
        'value_in_key' => true,
        'values' => array(
            'первое значение',
            'второе значение',
            'третье значение'
        )
    );

0
Валерий
не в сети 3 года
На сайте с 20.03.2015
Участник
Тем 35
Сообщения 87
6
10:08

Спасибо за объяснение! Разрешите еще вопрос с небольшим отклонением от темы. Возможно ли передать в 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
);

0
Андрей CS
не в сети 24 часа
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16854
7
10:11

легко

$users = get_users( array(
'meta_key'     => 'user_meta_1',
'fields'  => array( 'ID','user_login')
) ); 

$values = array();
foreach($users as $user){
	$values[$user->ID] = $user->user_login;
}

и уже $values передавайте в массив поля

1
Валерий
не в сети 3 года
На сайте с 20.03.2015
Участник
Тем 35
Сообщения 87
8
10:17

Круто, все работает, благодарю!

0
Тема закрыта. Публикация новых сообщений запрещена.