Пример wp_update_post()... как обновить the_content в текстовой области?
Я использую функцию ниже для обновления мета-данных записи с фронтенда. Как лучше всего добавить текстовую область (textarea), которая обновляет the_content()
используя wp_update_post()
?
if ( isset( $_POST['albums'] ) && wp_verify_nonce($_POST['albums'],'update_albums_postmeta') )
{ //если проверка nonce успешна.
global $post;
$postid = $post->ID;
$data = $_POST['priceone'];
update_post_meta($postid,'_releasedate',$data);
$data = $_POST['pricetwo'];
update_post_meta($postid,'_amazonlink',$data);
}
-
Редактирование:
Этот фрагмент отправляет изменения в базу данных, однако когда страница обновляется после отправки, показывается старый the_content()
. Чтобы увидеть изменения, нужно вручную обновить запись.
Есть ли ошибки в моем коде?
if ( isset( $_POST['drw_inventory'] ) && wp_verify_nonce($_POST['drw_inventory'],'update_drw_postmeta') )
{ //если проверка nonce успешна.
global $post;
$data_content = $_POST['description'];
$my_post = array();
$my_post['ID'] = $post->ID;
$my_post['post_content'] = $data_content;
wp_update_post( $my_post );
}

У меня такая же проблема. Мой код находится в файле single.php
. Я использую код из этой статьи: Фронтенд-редактирование постов с помощью формы
После нажатия на кнопку отправки, код в single.php
действительно выполняет wp_update_post()
, и ID поста возвращается. Поскольку это выполняется из файла шаблона, wp_query уже заполнен, поэтому страница всё ещё отображает старые данные поста. Если обновить страницу без отправки формы, новые данные загружаются.
Не уверен, что это лучшее решение, но оно работает. После выполнения wp_update_post()
я перезаписываю глобальную переменную $wp_query
, используя тот же запрос, который выполнялся до вызова этого файла шаблона.
global $wp_query;
if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['post_id']) && !empty($_POST['post_title']) && isset($_POST['update_post_nonce']) && isset($_POST['post_content'])) {
$post_id = $_POST['post_id'];
$post_type = get_post_type($post_id);
$capability = ('page' == $post_type) ? 'edit_page' : 'edit_post';
if (current_user_can($capability, $post_id) && wp_verify_nonce($_POST['update_post_nonce'], 'update_post_' . $post_id)) {
$post = array(
'ID' => esc_sql($post_id),
'post_content' => wp_kses_post($_POST['post_content']),
'post_title' => wp_strip_all_tags($_POST['post_title'])
);
$result = wp_update_post($post, true);
if (is_wp_error($result)){
wp_die('Пост не сохранён');
}
$wp_query = new WP_Query($wp_query->query); // Сбрасывает глобальный запрос, чтобы обновлённые данные поста стали доступны.
} else {
wp_die("У вас нет прав на это действие");
}
}
Я пробовал вызывать wp_reset_postdata()
и wp_reset_query()
вместо этого, но, предполагаю, они сбрасываются на кешированную копию, потому что старые данные поста всё равно остаются.
Другое рабочее решение — получение текущего URL с помощью:
global $wp;
$current_url = home_url(add_query_arg(array(),$wp->request));
и затем после wp_update_post()
:
wp_redirect($current_url);
Код для $current_url был найден здесь.

Это зависит от того, где вы используете этот код. Возвращает ли вам global $post
именно ту запись, которую вы хотите обновить? Ваш код для обновления записи в WordPress выглядит правильным, но корректно ли работает условное выражение и возвращает ли $post->ID
правильное числовое значение?
