Предупреждение array_filter - wp-includes/post.php строка 3148

13 дек. 2017 г., 15:02:57
Просмотры: 2.1K
Голосов: 1

Я добавил следующий код (см. ниже) для отправки поста с фронтенда. При отправке появляется это предупреждение:

Warning: array_filter() expects parameter 1 to be an array, string given in [...]/wp-includes/post.php on line 3148

И я не могу понять, откуда берется это предупреждение - какой массив передается как строка?

function ty_front_end_form() {

    ?>
    <form id="custom-post-type" name="custom-post-type" method="post" action="">

    <p><label for="title">Заголовок поста</label><br />

    <input type="text" id="title" value="" tabindex="1" size="20" name="title" />

    </p>

    <p><label for="description">Описание поста</label><br />

    <textarea id="description" tabindex="3" name="description" cols="50" rows="6"></textarea>

    </p>

    <p><?php wp_dropdown_categories( 'show_option_none=Категория&tab_index=4&taxonomy=category' ); ?></p>

    <p><label for="post_tags">Теги поста</label>

    <input type="text" value="" tabindex="5" size="16" name="post-tags" id="post-tags" /></p>

    <p align="right"><input type="submit" value="Опубликовать" tabindex="6" id="submit" name="submit" /></p>

    <input type="hidden" name="post-type" id="post-type" value="custom_posts" />

    <input type="hidden" name="action" value="custom_posts" />

    <?php wp_nonce_field( 'name_of_my_action','name_of_nonce_field' ); ?>

    </form>
    <?php

    if($_POST){
        ty_save_post_data();
    }

}
add_shortcode('custom-post','ty_front_end_form');

function ty_save_post_data() {

    if ( empty($_POST) || !wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') )
    {
       print 'Извините, ваша nonce-проверка не сработала.';
       exit;

    }

    else{ 

        // Простая валидация формы - проверяем наличие контента
        if (isset ($_POST['title'])) {
            $title =  $_POST['title'];
        } else {
            echo 'Пожалуйста, введите заголовок';
            exit;
        }
        if (isset ($_POST['description'])) {
            $description = $_POST['description'];
        } else {
            echo 'Пожалуйста, введите содержание';
            exit;
        }

        if(isset($_POST['post_tags'])){
        $tags = $_POST['post_tags'];
        }else{
        $tags = "";
        }

        // Собираем данные формы в массив $post
        $post = array(
            'post_title' => wp_strip_all_tags( $title ),
            'post_content' => $description,
            'post_category' => $_POST['cat'],  // Работает и с пользовательскими таксономиями
            'tags_input' => $tags,
            'post_status' => 'draft',           // Варианты: publish, preview, future и др.
            'post_type' => 'listings'  // Укажите свой тип записи при необходимости
        );
        wp_insert_post($post);  // Ссылка на документацию: http://codex.wordpress.org/Function_Reference/wp_insert_post

        $location = home_url(); // URL для редиректа (должен вести на страницу входа)

        echo "<meta http-equiv='refresh' content='0;url=$location' />"; exit;
    } // конец IF

}
1
Комментарии

Всегда добавляйте код, если это необходимо для вопроса. Если пользователи прочитают его позже, а внешняя ссылка окажется нерабочей, вопрос/ответ не будет полезным.

bueltge bueltge
13 дек. 2017 г. 15:19:00
Все ответы на вопрос 1
1

Если вы проверите строку из сообщения об ошибке, то в WordPress 4.9.1 обнаружите использование функции array_filter, которая требует массив в качестве параметра (см. код).

Ваше значение внутри массива для записи должно быть массивом для 'post_category', в данный момент это строка.

Из исходного кода ядра WordPress:

* @type array  $post_category         Массив названий категорий, их ярлыков (slug) или ID.
*                                     По умолчанию используется значение опции 'default_category'.

В вашем примере исходного кода следует изменить это, и всё заработает: 'post_category' => array( $_POST['cat'] ),.

// Добавляем содержимое формы в $post в виде массива
$post = array(
    'post_title' => wp_strip_all_tags( $title ),
    'post_content' => $description,
    'post_category' => array( $_POST['cat'] ), // Также можно использовать для пользовательских таксономий
    'tags_input' => $tags, // Требуется массив
    'post_status' => 'draft', // Варианты: publish, preview, future и т.д.
    'post_type' => 'listings', // Используйте пользовательский тип записи, если нужно
);
wp_insert_post( $post );
13 дек. 2017 г. 15:23:42
Комментарии

также tags_input — это array для тегов, вероятно, лучше использовать explode с запятой, чтобы можно было указать больше одного тега

Shibi Shibi
13 дек. 2017 г. 15:31:29