Я не программист! И если проблема для вас очевидна, то для меня нет, потому не ругайтесь.
Может кто-нибудь подсказать, где у меня ошибка и почему пост не сохраняется (не создается). Форма сделана через кастомную форму 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;
    
}
выполняется? т.е. в форме есть поле у которого 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 'обработало Добавить'; уберу.
monk сказал(а)
Да, у кнопки.
нет, у этой кнопки указывается значение для value, а не для name, значит проверка
if(!isset($_POST['Добавить']))
никогда не вернет false
если очень хочется отлавливать данные в обработчике подобным образом, то добавьте в форму скрытое поле с уникальным значением, по которому и отлавливайте
Спасибо за разъяснение. Буду пробовать.
Еще раз спасибо пост создается, но теперь другая проблема (правда уже не по 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']
	) );
	}
Андрей CS сказал(а)
поле со слагом field_two как было создано? его массив тут приведите
Как в примере документации
array(
        'type' => 'select',
        'slug' => 'field_two',
        'title' => __('Категория'),
        'values' => array(
            __('Каталог'),
            __('Форум'),
            __('Портал')
        ),
        'notice' => __('выберите одно из значений')
    ),
        массив values в поле типа select представляет из себя ассоциативный массив, где подразумевается наличие пары ключ-значение, вот ключи как раз и передаются в качестве значения value, в вашем случае, фактически структура такая:
array(
	0 => __('Каталог'),
	1 => __('Форум'),
	2 => __('Портал')
)т.е. при выборе значения "Форум" передается число 1, т.е. приходит такое значение
array(get_cat_ID(1)), что естественно неверно.
Вам требуется в массиве values явно указать идентификаторы рубрик в качестве ключей, а указание категории изменить так:
'post_category' => array($formData['field_two']),
Андрей CS сказал(а)
таким образом, вы получаете лишние запросы к БД на получение идентификаторов категорий, вы можете указать ИД категорий сразу, руками
Где-то читал, что БД работает очень быстро, потому пару лишних запросов сильно не повлияют. Тем более, что функция, в данном случае, вызывается только во время использования шорткода (формы), что вряд ли существенно может повлиять на ответ сервера.
В любом случае это пока костыль. Планирую сделать автоматический подхват категорий и добавление в селект.
Еще один небольшой вопрос знатокам.
Пытаюсь подключить кастомный шаблон через хук 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 );