Здравствуйте,
Столкнулся со следующей трудностью при попытке обновить черновик с 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, а после нее как раз и шли все апредйты. В общем, тормоз, каюсь :)
Спасибо за помощь!