web-dev-qa-db-ja.com

Wp_update_post()の制限は何ですか?

Wp_postsテーブルに2つのフィールドがあり、wp_update_post()は変更できないようです。私は次のコードを使用しようとしています。

$echo $group_access;
$echo $tag_list;
$my_post = array(
      'ID'           => 12095, 
      'post_title'   => 'Test Title',
      'post_content' => 'Test Content',     
      'group_access' => $group_access,
      'tag_list'     => $tag_list,
  );
// Update the post into the database
$post_id = wp_update_post( $my_post, true );

if (is_wp_error($post_id)) {
    $errors = $post_id->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
}

$group_accessおよび$tag_list変数は正しい値をエコーバックします。 post_titlepost_contentは正しく更新されます。 group_accesstag_listは更新されず、エラーもありません。

当然、私はテーブルをチェックしました、そしてgroup_accesstag_listは正しい列ヘッダーです。

なぜうまくいかないのか私は困惑しています。 wp_update_post()は、デフォルトのWP installの一部ではない列を変更できませんか?それはおそらくデータ型のものでしょうか(例えば、配列または整数を渡すべきですが、私は文字列を渡します)。

4
fredsbend

あなたは正しいです; WordPressはwp_update_post()またはwp_insert_post()を使ってカスタムデータベースの列を更新しません。カスタムデータベース列を作成する代わりに、ポストメタAPIや分類法APIを使用することを検討してください。

wp_postsテーブルを変更する必要がある場合は、自分でカスタム列を更新する必要があります。カスタムデータベース列を考慮に入れない他のさまざまなプラグインで問題が発生する可能性があります。

3
Dave Romsey

wp_insert_post_data は投稿データがデータベースに挿入される直前に起動します。これ以降に起こる唯一のことは、$ dataがwp_unslash()であるということです。このフィルタを使用して、wp_update_postを送信した$ postarrとこのフィルタに渡された$ postarrを比較できます。両者が異なる場合は、データベースに挿入する前に$ dataをフォーマットできます。

私はすぐにこれをモックアップしました。テストはしていませんが、多少の修正を加えても動作するはずです。

クラス-wpse-258786.php:

class wpse_258786 {
  protected $postarr;
  public function __construct( $postarr ) {
    $this->postarr = $postarr;
  }
  public function insert_post_data( $data, $postarr ) {
    //* Make sure this is added each time before each post
    remove_action( 'wp_insert_post_data', [ $this , 'insert_post_data' ] , 10 );

    if( $postarr !== $this->postarr ) {
      //* Format the $data to insert into table
    }
    return $data;
  }
}

あなたのfile.phpに

include_once( PATH_TO . 'class-wpse-258786.php' );

...

$echo $group_access;
$echo $tag_list;
$my_post = array(
      'ID'           => 12095, 
      'post_title'   => 'Test Title',
      'post_content' => 'Test Content',     
      'group_access' => $group_access,
      'tag_list'     => $tag_list,
  );

//* Filter the post data before inserting into database
add_action( 'wp_insert_post_data',
  [ new wpse_258786( $my_post ), 'insert_post_data' ], 10, 2 );

// Update the post into the database
$post_id = wp_update_post( $my_post, true );

追加するための編集:クラスを別のファイルに配置し、それを一度インクルードしてから、クラスにフィルターを追加します。それからwp_update_post()の直前にコンストラクタのpostデータでフィルタを追加します。フックが起動したら、フィルタを削除して2回以上起動しないようにすることができます。

あなたのコメントに応えて、あなたはcouldを使って$ wpdbを使っています。実際、それがwp_insert_post()のやり方です。 wp_insert_post()抽象を使うことの素晴らしいところは、それがデータベースに入る前にデータを修正するために使うことができるたくさんのアクションとフィルターフックを導入することです。 tracの wp_insert_post() 関数をチェックしてください。

2
Nathan Johnson