web-dev-qa-db-ja.com

wp_insert_post()は正しい投稿IDを返し、失敗はしていませんが、投稿の内容は更新されません

それで、私は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分以上イメージをロードしようとしてからタイムアウトします(ただし、そのイメージはその分の間すでにページに表示されており、タイムアウトになるとイメージは消えます)。

誰もがなぜこれがうまくいかないのか(エラーゼロで)提案することができますが、時にはうまくいくのでしょうか?事前にどうもありがとうございました、あなたがより多くのコードや背景が必要な場合は私に知らせてください。

1
Jeremy Muckel

AJAXコールバックの修正を気にする必要はありません。十分にテストされたREST AP​​Iエンドポイントがすでに用意されています。

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

それでは、ヘルパースクリプトをエンキューして、URLとセキュリティトークン/ nonceを渡します。

wp_enqueue_script( 'wp-api' );

投稿タイプを登録するときにこのオプションを追加することで、カスタム投稿タイプのREST AP​​Iを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 AP​​Iでは、投稿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 AP​​Iは、なぜうまくいかなかったのかを示すように設計されています。 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を返すので、ありがたいことに、失敗やエラーメッセージには注意を払ってください。ここでは、存在しないエンドポイントにリクエストを行おうとしましたが、ログアウトしたときに許可を得ていなかったエンドポイントにもリクエストしました。

2
Tom J Nowell

@TomJNowellのおかげで、私はwp_insert_post()を使用してうまくいかなかったので、phpバージョンのREST AP​​Iで投稿を更新することができました。

そうしなければならなかった:

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.");
        }
});
0
Jeremy Muckel