web-dev-qa-db-ja.com

タグやカテゴリが投稿リクエストに追加されないのはなぜですか。 WP Rest API

私はV2.0を使っていて、/ postsエンドポイントを使って投稿を作成しようとしています。

これが私の要求と一緒に送信されているペイロードです:

var payload =
   {
     title : "some title",
     format : "link",
     tags: ["tag1", "tag2"],
     categories: ["newsletter"],
     content: "http://someurl.com",
     status: "publish"
   };

投稿が正常に作成され、カテゴリとタグを除く他のすべてのフィールドが追加されました。

どちらも文字列の配列を取ることになっているのがわかります。私はここで何が足りないのですか?

また、すでにサイトに存在するカテゴリとタグの両方を追加してみたところ、まったく新しいものが追加されました。どちらも動作しません。

1
DMTintner

あなたはあなたの言葉で名前を使っています。デフォルトでは、既存のid(あなたの場合はcat IDとtag ID)を使ってみてください。

あなたが https://plugins.trac.wordpress.org/browser/rest-api/trunk/lib/endpoints/class-wp-rest-posts-controller.php#L918を見ればabsintを使用してそれらを負でない整数にサニタイズします。これが助けになれば幸いです。

ここでは、rest_insert_{$this->post_type}をフックして用語(タグとカテゴリ)を作成し、 wp_insert_post によって作成された投稿IDの後に投稿に設定するコード例を示します。注:タグとカテゴリ要求はOPサンプルコードとして名前配列に入っています。

add_action( 'rest_insert_post', 'wpse220930_rest_insert_post', 1, 3 );
function wpse220930_rest_insert_post( $post, $request, $update = true )
{
    if ( ! empty( $request['tags'] ) )
        wp_set_object_terms( $post->ID, $request['tags'], 'post_tag', $update );

    if ( ! empty( $request['categories'] ) )
        wp_set_object_terms( $post->ID, $request['categories'], 'category', $update );
}
2
Jevuska

配列は次のようになります。

var payload =
   {
     title : "some title",
     format : "link",
     tags: [1,2],
     categories: [3],
     content: "http://someurl.com",
     status: "publish"
   };

番号1と2はID 1と2のタグを参照し、同様に3はID 3のカテゴリを呼び出します。

既存のタグとカテゴリのみを参照したくないので、最初に作成する必要があります。

次の関数は、タグ名(タグ1およびタグ2)を含む配列を使用し、/ wp-json/wp/v2/tagsエンドポイントにポストします。タグが既に存在する場合、そのタグのIDを返します。タグが存在しない場合、新しいタグを作成し、そのIDを返します。

postIDは、タグを追加する投稿のIDです。

  function getTagIDs(postID) {
    let tagNames = [tag 1, tag 2];
    let answers = tagNames.length;
    let receivedAnswers = 0;
    let tagIDList = [];
    $.each(tagNames, function(i, tagName) {
      let tagArguments = {
        'name': tagName
      };
      let createPost = new XMLHttpRequest();
      let postURL = phpVariables.siteBaseURL + '/wp-json/wp/v2/tags';
      createPost.open('POST', postURL);
      createPost.setRequestHeader('X-WP-Nonce', phpVariables.nonce);
      createPost.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
      createPost.onreadystatechange = function() {
        if (this.readyState === 4) {
          receivedAnswers++;
          responseText = JSON.parse(this.responseText);
          if (this.status === 400) {
          tagID = responseText.data.term_id;
          } else {
          tagID = responseText.id;
          }
          tagIDList.Push(tagID);
          if (answers == receivedAnswers)
            PostToWpApi(postID, tagIDList);
        }
      };
      createPost.send(JSON.stringify(tagArguments));
    });
  };

関数がすべてのタグIDを配列tagIDListに保存した後にのみ、PostToWpApiという別の関数を実行します。

  function PostToWpApi(postID, tagIDs) {
    let postMetaData = {
      'tags': tagIDs,
    };
    let createPost = new XMLHttpRequest();
    let postURL = phpVariables.siteBaseURL + '/wp-json/wp/v2/posts/' + postID;
    createPost.open('POST', postURL);
    createPost.setRequestHeader('X-WP-Nonce', phpVariables.nonce);
    createPost.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
    createPost.send(JSON.stringify(postMetaData));
  };

私はあなたがすでにそうしていると仮定しますが、これを読んでいる他の人のために、phpVariables.siteBaseURLphpVariables.nonceから来ています。

これらの変数は最初にPHPで生成され、JSが wp_localize_script を介してアクセスできるようにしました。

JSをキューに入れたPHPファイルには、次も追加する必要があります。

public function enqueue(){
 wp_enqueue_script('scripthandle', 'urltoscript.com/script.js');
 wp_localize_script( 'scripthandle', 'phpVariables', array(
  'nonce' => wp_create_nonce( 'wp_rest' ),
  'siteBaseURL' => get_site_url(),
 ));
}
0
Marcello Curto