Как сохранить пост с front end с помощью AJAX Worpdress?

Здравствуйте,

Столкнулся со следующей трудностью при попытке обновить черновик с Front end страницы сайта на Wordpress:

Функция используется, как при отправке формы, так и при Ajax сохранении черновика.
Черновик сохраняется без проблем с помощью wp_insert_post и корректно возвращается ID, которое возвращается форме и сохраняется в hidden поле.
При следующем нажатии на кнопку, идет проверка на ID и уже пост сохраняется через wp_update_post.

Так вот, заголовок и контент без проблем меняется, а вот последующие функции update_post_meta не работают. Кастомные поля не заполняются, не задается post thumbnail и т.д.. Уже сломал голову в поиске проблемы.

Часть кода обработчика:
$new_recipe = array(
        'post_title'	=>	$title,
        'post_content'	=>	$description,
        'post_status'	=>	'draft',
        'post_type'	=>	'recipe'
    );

    if(isset($_POST['tags']))
        $new_recipe['tags_input'] = array($_POST['tags']);


/////////////////////////////////////////////////////////////////////////////////////
// Добавляем автора рецепта
/////////////////////////////////////////////////////////////////////////////////////
    if(is_user_logged_in())
    {
        global $current_user;
        get_currentuserinfo();
        $new_recipe['post_author'] = $current_user->ID;
    }

/////////////////////////////////////////////////////////////////////////////////////
// Сохраняем пост и получаем ID
/////////////////////////////////////////////////////////////////////////////////////
    if(isset($_POST['post_id']) && !wp_is_post_revision( $_POST['post_id'])){

        $update_recipe = array(
            'ID'            => $_POST['post_id'],
            'post_title'	=>	$title,
            'post_content'	=>	$description,
            'post_status'	=>	'draft',
            'post_type'	=>	'recipe'
        );
        $recipe_id = wp_update_post($update_recipe);

    }
        else{
            $recipe_id = wp_insert_post($new_recipe);
        }

    if (defined('DOING_AJAX') && DOING_AJAX) {
        wp_send_json_success ($recipe_id);

    }
/////////////////////////////////////////////////////////////////////////////////////
// Добавляем предназначение в Meta-Box foodpress_food_for
/////////////////////////////////////////////////////////////////////////////////////
    if(isset($_POST['food_for'])){
        update_post_meta($recipe_id, 'foodpress_food_for', $_POST['food_for']);
    }


    if(isset($_POST['photo']))
        set_post_thumbnail($recipe_id, $_POST['photo']);


function saveItem(status, autosave) {
    jQuery('.btn-block').attr('disabled', true);

    var formObj = jQuery('#RecipeForm');
    var serialized = jQuery(formObj).find(":input").filter(function () {
            return $.trim(this.value).length > 0
        }).serialize();
    jQuery.ajax({
        type: 'POST',
    //    dataType: 'json',
        url: "/wp-admin/admin-ajax.php",
        data:serialized,
        success: function (data) {
            jQuery('.btn-block').attr('disabled', false);
            jQuery("#ResultPrev").html(data);
               if(data.success == true){
                console.log(data.data);
               jQuery(formObj).find('input[name=post_id]').val(data.data);
            }
            }
        },
        complete: function(){loader('stop', 0);},
      //  error: ajaxErrorHandle
    });
}


UPD1: Заметил, что AJAX возвращает Notice, что Undefined index: my_metabox_nonce , Убрал проверку на nonce, начало возвращать, что все переменные пустые. Не могу понять, проверка переменных идет во время выполнения wp_update_post или же после..

UPD2: В общем, проблема банально разрешилась. Переименовал скрытое поле в форме, которое получает ID с post_id, на ID и соответственно в коде изменил $_POST["post_id"] на $_POST["ID"] и все заработало. Я так и не понял, почему так, так как ID посту я присваивал уже с $_POST["post_id"].

И еще одно, походу это и была основная проблема:
if (defined('DOING_AJAX') && DOING_AJAX) {
        wp_send_json_success ($recipe_id);

    }

Нужно было поставить в самом конце функции. Вот как раз эта зараза и обрывала работу фукнции возвращая ID, а после нее как раз и шли все апредйты. В общем, тормоз, каюсь :)

Спасибо за помощь!
  • Вопрос задан
  • 3019 просмотров
Пригласить эксперта
Ответы на вопрос 1
maxxannik
@maxxannik
Сайты на WordPress + Интернет магазины WooCommerce
set_post_thumbnail - не нашел такой функции.
мб она ваша?

по сути картинку нужно сначала правильно сохранить, затем получить ее ID и записать в мету поста.

update_post_meta вообще не нашел по коду. чтобы понять пчм оно не работает, нужно понять где эта функция есть и как она работает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы