Домой WordPress WordPress: Проблемы и решения Не получается сохранить данные из формы WP recall
14ответ(ов) в теме
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
1
04:20

Я не программист! И если проблема для вас очевидна, то для меня нет, потому не ругайтесь.

Может кто-нибудь подсказать, где у меня ошибка и почему пост не сохраняется (не создается). Форма сделана через кастомную форму wp-recall. Выводится своим шорткодом. Код для формы взят из документации wp-recall и обработка результатов так же из примера.

В post_category нет ошибки - комментировал ее, чтобы не влияла. В условии post_exists тоже нет - проверял (комментил).

add_action('wp', 'my_form_save_data', 10);
function my_form_save_data(){
    
    if(!isset($_POST['Добавить'])) return false;
    
    $formData = wp_slash($_POST);

    if ( 0 == post_exists($formData['field_one']) ) {
    $post_id = wp_insert_post( array(
	'comment_status' => 'closed',
    'post_type'      => 'post',
	'ping_status'    => 'closed',
	'post_category'  => $formData['field_two'],
	'post_author'    => $user_ID,
	'post_content'   => $formData['field_three'],
	'post_status'    => 'publish',
	'post_title'     => $formData['field_one']
	) );

	}

	wp_redirect($location); exit;
    
}
Редакции сообщения
02.01.2020 04:26monkПричина: не указано
0
Андрей CS
не в сети 20 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
2
09:03

вижу, что не определена переменная $user_ID, делается так: global $user_ID
вы уверены, что условие if(!isset($_POST['Добавить'])) return false; выполняется? т.е. в форме есть поле у которого name="Добавить"? сомневаюсь в этом

0
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
3
20:27

выполняется? т.е. в форме есть поле у которого name="Добавить"? сомневаюсь в этом

Да, у кнопки.

$form = rcl_get_form(array(
    'method' => 'post',
    'action' => '/',
    'submit' => __('Добавить'),
    'fields' => $fields
));

echo $form;

Создание поста работает в activate.php там тоже используется $userID. Сейчас попробую объявить глобально и отпишусь.

Попробовал объявить не вышло. Комментариями вообще убрал атрибут post_author, чтобы исключить его влияние - не работает.

В данном случае return 'обработало Добавить'; Так же не сработал. Ошибка раньше. Обработка идет сразу же за формой в шорткоде (ранее было вне шорткода), но ни чего не поменялось. Исключил категории и автора комментариями.

add_action('wp', 'my_form_save_data', 10);
function my_form_save_data() {
    
    if(!isset($_POST['Добавить'])) return false;
    return 'обработало Добавить';
    $formData = wp_slash($_POST);

    if ( 0 == post_exists($formData['field_one']) ) {
    $post_id = wp_insert_post( array(
	'comment_status' => 'closed',
    'post_type'      => 'post',
	'ping_status'    => 'closed',
//	'post_category'  => $formData['field_two'],
//	'post_author'    => $user_ID,
	'post_content'   => $formData['field_three'],
	'post_status'    => 'publish',
	'post_title'     => $formData['field_one']
	) );

	}

	wp_redirect($location); exit;
    
}

Перед следующими попытками return 'обработало Добавить'; уберу.

Редакции сообщения
02.01.2020 20:48monkПричина: не указано
0
Андрей CS
не в сети 20 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
4
09:46

monk сказал(а)
Да, у кнопки.

нет, у этой кнопки указывается значение для value, а не для name, значит проверка
if(!isset($_POST['Добавить']))
никогда не вернет false
если очень хочется отлавливать данные в обработчике подобным образом, то добавьте в форму скрытое поле с уникальным значением, по которому и отлавливайте

1
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
5
11:28

Спасибо за разъяснение. Буду пробовать.

Еще раз спасибо пост создается, но теперь другая проблема (правда уже не по recall, а больше по wp. 😅

Может у кого время есть объяснить, что не так. В общем пост создается, но не могу его поместить в нужную категорию. Категория создана. В форме использую select для выбора категории (слаг field_two) с value названия рубрик.
Функция публикации поста сейчас так выглядит:

function my_form_save_data() {
    
    if(!isset($_POST['my_form_submit'])) return false;
    
    $formData = $_POST;
    
    if ( 0 == post_exists($formData['field_one']) ) {
    $post_id = wp_insert_post( array(
	'comment_status' => 'closed',
    'post_type'      => 'post',
	'ping_status'    => 'closed',
	'post_category'  => array(get_cat_ID($formData['field_two'])),
	'post_author'    => $user_ID,
	'post_content'   => $formData['field_three'],
	'post_status'    => 'publish',
	'post_title'     => $formData['field_one']
	) );
	}

Редакции сообщения
03.01.2020 14:09monkПричина: не указано
0
Андрей CS
не в сети 20 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
6
15:54

поле со слагом field_two как было создано? его массив тут приведите

0
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
7
20:45

Андрей CS сказал(а)
поле со слагом field_two как было создано? его массив тут приведите

Как в примере документации

array(
        'type' => 'select',
        'slug' => 'field_two',
        'title' => __('Категория'),
        'values' => array(
            __('Каталог'),
            __('Форум'),
            __('Портал')
        ),
        'notice' => __('выберите одно из значений')
    ),

0
Андрей CS
не в сети 20 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
8
21:21

массив values в поле типа select представляет из себя ассоциативный массив, где подразумевается наличие пары ключ-значение, вот ключи как раз и передаются в качестве значения value, в вашем случае, фактически структура такая:

array(
	0 => __('Каталог'),
	1 => __('Форум'),
	2 => __('Портал')
)

т.е. при выборе значения "Форум" передается число 1, т.е. приходит такое значение
array(get_cat_ID(1))
, что естественно неверно.
Вам требуется в массиве values явно указать идентификаторы рубрик в качестве ключей, а указание категории изменить так:
'post_category'  => array($formData['field_two']),

0
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
9
07:12

Спасибо, Андрей. Сделал ключи в виде функций. Вроде все работает 🙂

'values' => array(
            get_cat_ID('Каталог') => __('Каталог'),
            get_cat_ID('Портал')  => __('Портал')
            ),

0
Андрей CS
не в сети 20 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
10
07:33

таким образом, вы получаете лишние запросы к БД на получение идентификаторов категорий, вы можете указать ИД категорий сразу, руками

0
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
11
12:30

Андрей CS сказал(а)
таким образом, вы получаете лишние запросы к БД на получение идентификаторов категорий, вы можете указать ИД категорий сразу, руками

Где-то читал, что БД работает очень быстро, потому пару лишних запросов сильно не повлияют. Тем более, что функция, в данном случае, вызывается только во время использования шорткода (формы), что вряд ли существенно может повлиять на ответ сервера.

В любом случае это пока костыль. Планирую сделать автоматический подхват категорий и добавление в селект.

Редакции сообщения
04.01.2020 12:35monkПричина: не указано
0
Андрей CS
не в сети 20 часов
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
12
12:42

БД работает быстро) но не так быстро, чтобы забывать о кол-ве запросов в БД

0
monk
не в сети 2 года
На сайте с 20.01.2019
Участник
Тем 8
Сообщения 44
13
14:12

Еще один небольшой вопрос знатокам.

Пытаюсь подключить кастомный шаблон через хук template_include появилась ошибка "wrapper is disabled in the server configuration by allow_url_include=0". Погуглил пишут, что нужно либо включить этот параметр - либо файл включать не по url, а указывая путь к нему на сервере. Еще погуглил оказывается ошибка связана с тем, что в запросе к файлу используется http потому сервер не понимает, что данный запрос идет из include скрипта расположенного на этом же сервере. Потому сервер обрубает http запрос к вашему скрипту, чтобы его код не могли получить другие пользователи. В общем нужно использовать относительный путь без http.

Пробовал использовать функцию rcl_addon_url, но она как раз возвращает http путь. Когда использую $template = 'template.php';, то поиск шаблона происходит по адресу OSPanel/domains/test/wp-includes/template.php.

Собственно вопрос: Как в данном случае правильно получить/передать путь к файлу шаблона, который хранится в папке дополнения? Можно ли использовать ../../wp-content/plugins/wp-recall/add-on/stkancatalog/template.php (проверил не работает - поиск идет именно по папке wp-includes)? Может есть функция какая-нить для получения пути?

Вроде нашел ответ на свой вопрос $_SERVER['DOCUMENT_ROOT'].'/photo/img1.jpg'

function stkancatalog_tmp_path( $template ) {
if ( is_category('Каталог') ) {
    $template = rcl_addon_url('template.php', __FILE__);
    return $template;
	}
	
}
add_filter( 'template_include', 'stkancatalog_tmp_path', 100 );

Редакции сообщения
04.01.2020 14:15monkПричина: не указано
04.01.2020 14:19monkПричина: не указано
04.01.2020 14:22monkПричина: не указано
04.01.2020 14:37monkПричина: не указано
0
Вова (Otshelnik-Fm)
не в сети 2 дня
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18647
14
16:47

monk сказал(а)
Еще один небольшой вопрос

В одной теме решаем один вопрос. А тут это уже третий.

monk сказал(а)
пост создается,

вижу первый вопрос решен - закрыто.

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