それで、私はAjaxを使ってカスタム投稿タイプのために動的に投稿コンテンツを一つ一つ構築するプラグインを持っています。ユーザーが自分のページを構築したら、Update/Publishを押すとAjaxが構築したページ全体をメインプラグインPHPファイルに送り、そこで私は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()
の引数までデータを追跡しました。それは常に正しいです。関数ALWAYSは投稿IDを返します。これは成功したことを意味します。 WP_Error
が返されたり、404や500のようなHTMLコードのエラーやそれに似たものが返されることはありません。
クロム開発者向けツールコンソールにもエラーはありません。しかし、それはいくつか成功して更新します - 多分それはうまくいく10の試行ごとに1。
私はPOSTの代わりにGETを使ってみました
引数から'post_status' => 'publish'
を削除してみました。
utf8_encode()
を使ってpost_content
をUTF8に変換してみました。
post_content_filtered
ではなくpost_content
を使ってみました。
何も機能していないようで、それはランダムに機能します、そして私はパターンを見つけることができません。
私が持っているかもしれない他の情報は、画像がこの同じページにロードするのが難しいということです。ページのコンテンツに画像があると、次のようなエラーが表示されます。
"net :: ERR_SPDY_PING_FAILED"または "net :: ERR_CONNECTION_RESET"
または
"net :: ERR_CONNECTION_CLOSED"
ページロード時に時々。サーバーは1分以上イメージをロードしようとしてからタイムアウトします(ただし、そのイメージはその分の間すでにページに表示されており、タイムアウトになるとイメージは消えます)。
誰もがなぜこれがうまくいかないのか(エラーゼロで)提案することができますが、時にはうまくいくのでしょうか?事前にどうもありがとうございました、あなたがより多くのコードや背景が必要な場合は私に知らせてください。
AJAXコールバックの修正を気にする必要はありません。十分にテストされたREST APIエンドポイントがすでに用意されています。
example.com/wp-json/wp/v2/zen_page
それでは、ヘルパースクリプトをエンキューして、URLとセキュリティトークン/ nonceを渡します。
wp_enqueue_script( 'wp-api' );
投稿タイプを登録するときにこのオプションを追加することで、カスタム投稿タイプのREST APIをmust有効にします。そうしないと、zen_page
の残りのエンドポイントはcoreによって作成されません。
'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-api
をエンキューすると、WPは自動的にwpApiSettings
オブジェクトを組み込み、data
はこれらの値を取ります 。これを行うにはアクティブなログインクッキーが必要です。それが選択肢ではない場合は、新しい休息エンドポイントを作成できます。
新しいものを作成したい場合は、ここにPOSTリクエストを送信してください。
example.com/wp-json/wp/v2/zen_page
更新したい場合は、POSTリクエストをここに送ってください。
example.com/wp-json/wp/v2/zen_page/2
2は更新したい投稿IDです。削除するにはDELETE要求を送信してください。 REST APIでは、投稿IDやアクションを渡すのではなく、URLを使用します。URLが異なるページをロードするのと同じ方法で、エンドポイントが異なると動作が異なります。 GET
/POST
/DELETE
/PUT
を指定できます。これらはすべて標準HTTP要求タイプであり、要求で渡されるパラメーターではありません。
rest_base
これにより、エンドポイントを作成するためにコアが使用するものを変更できます。
'rest_base' => 'bananas'
エンドポイントのURLをwp/v2/bananas
に変更します。 coreによって提供されているpages
エンドポイントがすでにあるので、このpages
に名前を付けたくないことに注意してください。
zen_page
page
という投稿タイプを使用し、カスタム分類法を使用してzen_pageを通常のページと区別した場合は、これは実際にはより良い可能性があります。
REST APIは、なぜうまくいかなかったのかを示すように設計されています。 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}}
Admin AJAXはこれらすべてのシナリオで0
を返すので、ありがたいことに、失敗やエラーメッセージには注意を払ってください。ここでは、存在しないエンドポイントにリクエストを行おうとしましたが、ログアウトしたときに許可を得ていなかったエンドポイントにもリクエストしました。
@TomJNowellのおかげで、私はwp_insert_post()を使用してうまくいかなかったので、phpバージョンのREST APIで投稿を更新することができました。
そうしなければならなかった:
1)私のカスタム投稿タイプの登録に'show_in_rest' => true
を含めます。
2)ヘルパースクリプトをエンキューします。wp_enqueue_script( 'wp-api' );
3)jqueryの投稿リクエストを処理するためにこのPHPを使用
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.");
}
});