Intereting Posts
Получить подкатегорию родительской категории Пользовательский тип сообщения Подготовленные утверждения неправильно использовались в ACF? Добавить страницу меню на мультисайте Получить последнее сообщение из категории Перенаправление при доступе / регистрации при входе в систему Если ваш блог был приложением на Facebook Как использовать командные строки, активировать тему в wp-cli, также настроить тему Vagrant / Sage? <? php wp_list_comments (); ?> возможно ли получить полный код на странице comments.php Фильтрация ссылки #more якоря, которая создается с помощью <! – more -> История страницы, интервал лет получить общее количество изображений с носителя с помощью xml-rpc Как изменить URL-адрес плагина? Почему я не могу редактировать или взаимодействовать с TinyMCE в моем виджете плагина WordPress? Пользовательский запрос по таксономии Как изменить изображения медиабиблиотеки

wp_insert_post () возвращает правильный идентификатор сообщения, без сбоев, но содержимое сообщения не обновляется

Итак, у меня есть плагин, который использует Ajax для динамического создания пост-контента по частям для настраиваемого типа сообщений. После того, как пользователь создал свою страницу, они нажимают Update / Publish, и Ajax отправляет всю встроенную страницу в основной файл PHP плагина, где я wp_insert_post() вызвать wp_insert_post() .

Вот мой соответствующий код (и да, параметр var new_content установлен и корректен):

 jQuery.ajax({ url: ajaxurl, method: 'POST', data : { update_or_create: '1', post_content: new_content, post_title: jQuery('#title').val(), pid: jQuery('#post_ID').val(), action : "update_or_save_zen_page" } , success : function(data, textStatus, XMLHttpRequest) { //alert(data); console.log(data); // the data sent to the php file is correct console.log(textStatus); // reads 'success' console.log(XMLHttpRequest); // normal from what I can tell, "readyState: 4" }, error : function(XMLHttpRequest, textStatus, errorThrown) { alert("An unknown error has occurred"); // this does not fire //console.log(data); //console.log(textStatus); //console.log(errorThrown); //console.log(XMLHttpRequest); } }); 

Вот PHP-код, который вы публикуете:

 function pbfcz_save_zen_page() { $pid = ( is_numeric($_POST['pid']) ? $_POST['pid'] : 0); $the_content = sanitize_post_field ('post_content', $_POST['post_content'], $pid); $the_title = sanitize_text_field ( $_POST['post_title'] ); $post_array = array ( 'ID' => $pid, 'post_title' => $the_title, 'post_content' => $the_content, // at this point, $the_content is correct 'post_status' => 'publish', 'post_type' => 'zen_page' ); $insert = wp_insert_post( $post_array, true ); // this returns the ID every time, meaning successful update, but it is not always successful //echo $insert; // this is always the post ID, meaning success echo $the_content; // this is still correc wp_die();} 

Когда пользователь выбирает сохранение, я отслеживал данные до тех пор, пока не будет аргумент для wp_insert_post() . Он ВСЕГДА правильный. Функция ALLWAYS возвращает идентификатор сообщения, значение которого было успешным. Я не получаю WP_Error или какие-либо ошибки HTML-кода, такие как 404 или 500 или что-то в этом WP_Error .

Я также не получаю никаких ошибок в консоли Chrome. Но он успешно обновляется. ИНОГДА – возможно, каждый 1 из 10 попыток работает.

Я попытался использовать GET вместо POST

Я попытался удалить 'post_status' => 'publish' из аргументов.

Я попытался преобразовать post_content в UTF8 с помощью utf8_encode() .

Я попытался использовать post_content_filtered а не post_content .

Кажется, что ничего не работает, и он работает случайным образом, и я не могу найти шаблон.

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

"net :: ERR_SPDY_PING_FAILED" или "net :: ERR_CONNECTION_RESET"

или:

"Чистая :: ERR_CONNECTION_CLOSED"

иногда при загрузке страницы. Сервер пытается загрузить изображение более минуты, а затем истекает время (но изображение уже отображается на странице в течение всей этой минуты, а затем, когда время истекает, изображение исчезает).

Может ли кто-нибудь предположить, почему это не работает (с нулевыми ошибками), но иногда работает? Спасибо всем заранее и дайте мне знать, если вам нужно больше кода или фона.

Solutions Collecting From Web of "wp_insert_post () возвращает правильный идентификатор сообщения, без сбоев, но содержимое сообщения не обновляется"

Не мешайте исправлению обратного вызова AJAX, уже существует конечная точка REST API, которая хорошо протестирована и делает все это из коробки:

 example.com/wp-json/wp/v2/zen_page 

Таким образом, давайте enqueue helper script, чтобы указать нам URL-адрес и токен безопасности / nonce:

 wp_enqueue_script( 'wp-api' ); 

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

 'show_in_rest' => true 

Затем отрегулируйте JS:

 var post_id = 1; jQuery.ajax({ url: wpApiSettings.root + 'wp/v2/zen_page/'+post_id, method: 'POST', beforeSend: function ( xhr ) { xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce ); }, data : { content: 'post content goes here', title: 'test post', status: 'publish' } }).fail( function( response ) { // failure console.log( 'failure' ); console.log( response ); }).done( function( response ) { // success! console.log( 'success' ); console.log( response ); }).; 

WP автоматически включает объект wpApiSettings при вводе в очередь wp-api , и data принимают эти значения . Для этого вам понадобится активный файл cookie для входа. Если это не вариант, вы можете создать новые конечные точки отдыха

Если вы хотите создать новый, отправьте запрос POST здесь:

 example.com/wp-json/wp/v2/zen_page 

Если вы хотите его обновить, отправьте запрос POST здесь:

 example.com/wp-json/wp/v2/zen_page/2 

Где 2 – это идентификатор сообщения, который вы хотите обновить. Отправьте запрос DELETE, чтобы удалить его. В REST API вы не передаете почтовые идентификаторы или действия, вместо этого используете URL-адреса, так же, как разные URL-адреса загружают разные страницы, разные конечные точки делают разные вещи. Вы можете GET / POST / DELETE / PUT , и это все стандартные типы запросов HTTP, а не параметр, переданный в запросе.

Примечания

rest_base

Это позволит вам изменить, какое ядро ​​использует для создания конечной точки, например

 'rest_base' => 'bananas' 

изменит ваш URL-адрес конечных точек на wp/v2/bananas . Обратите внимание, что вы не хотите называть эти pages поскольку уже имеется конечная точка pages предоставляемая ядром.

zen_page

Это могло бы быть лучше, если бы вы использовали тип публикации page и использовали пользовательскую таксономию, чтобы отличать zen_page от обычных страниц.

Он не работает

API REST предназначен для указания, почему он не работает, например, если я попытаюсь посетить wp-json/wp/v2/skjlfnvlkdjfv я получу:

{"code":"rest_no_route","message":"No route was found matching the URL and request method","data":{"status":404}}

и если я попытаюсь использовать конечную точку wp-json/wp/v2/settings в режиме инкогнито:

{"code":"rest_forbidden","message":"Sorry, you are not allowed to do that.","data":{"status":403}}

Администратор AJAX вернет 0 во всех этих сценариях, поэтому будьте благодарны, но обратите внимание на сообщения об ошибках или сообщения об ошибках. Здесь мы увидели, что я попытался сделать запрос к конечной точке, которая не существует, а затем снова к конечной точке, на которой у меня не было разрешения, поскольку я вышел из системы.

Благодаря @TomJNowell мне удалось обойтись с помощью wp_insert_post (), который не сработает, и обновить мои сообщения с помощью PHP-версии REST API.

Мне пришлось:

1) Включите 'show_in_rest' => true в мою регистрацию типа пользовательского сообщения.

2) Заблокируйте вспомогательный скрипт: wp_enqueue_script( 'wp-api' );

3) Используйте этот php для обработки запроса почты jquery

 add_action('wp_ajax_update_or_save_zen_page', 'pbfcz_save_zen_page', 99999); function pbfcz_save_zen_page() { $pid = $_POST['pid']; $the_content = sanitize_post_field ('post_content', $_POST['post_content'], $pid); $the_title = sanitize_text_field ( $_POST['post_title'] ); $the_content = str_replace('\"', '"', $the_content); $_rest = new WP_REST_Request('PUT', '/wp/v2/zen_page/' . $pid); $_rest->set_param( 'title', $the_title); $_rest->set_param( 'status', 'publish'); $_rest->set_param( 'content', $the_content); $response = rest_do_request($_rest); echo 'done'; wp_die(); // do not remove } 

Мой jQuery не сильно изменился из первоначального вопроса, размещая здесь для ясности:

 jQuery.ajax({ url: ajaxurl, method: 'POST', data : { post_content : new_content, post_title : jQuery('#title').val(), pid : post_id, action : "update_or_save_zen_page" } , success : function(data, textStatus, XMLHttpRequest) { //console.log(data); }, error : function(XMLHttpRequest, textStatus, errorThrown) { alert("An unknown error has occurred and the ajax request to create/update the post has failed."); } });