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_title
とpost_content
は正しく更新されます。 group_access
とtag_list
は更新されず、エラーもありません。
当然、私はテーブルをチェックしました、そしてgroup_access
とtag_list
は正しい列ヘッダーです。
なぜうまくいかないのか私は困惑しています。 wp_update_post()
は、デフォルトのWP installの一部ではない列を変更できませんか?それはおそらくデータ型のものでしょうか(例えば、配列または整数を渡すべきですが、私は文字列を渡します)。
あなたは正しいです; WordPressはwp_update_post()
またはwp_insert_post()
を使ってカスタムデータベースの列を更新しません。カスタムデータベース列を作成する代わりに、ポストメタAPIや分類法APIを使用することを検討してください。
wp_posts
テーブルを変更する必要がある場合は、自分でカスタム列を更新する必要があります。カスタムデータベース列を考慮に入れない他のさまざまなプラグインで問題が発生する可能性があります。
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()
関数をチェックしてください。