Я не программист! И если проблема для вас очевидна, то для меня нет, потому не ругайтесь.
Может кто-нибудь подсказать, где у меня ошибка и почему пост не сохраняется (не создается). Форма сделана через кастомную форму 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 );