action/filter
を使って保存プロセスを完全に無効にする方法が必要です。 query
、posts_clauses
、またはwp_insert_post/save_post/update_post
フックで動作するもの(例えば:)。
これまでのところ、私はreturn '';
だけを試みました。これは管理UIのポストオブジェクト部分の欠損値のためのたくさんのエラーを私に与えます。
これは「黙って」起こるはずなので、php_error/WP_DEBUG
などがTRUE/On
に設定されている場合でもエラーは発生しません。
ところで:私は ない 自動保存機能を無効にする方法を求めています。
function disable_save( $maybe_empty, $postarr ) {
$maybe_empty = true;
return $maybe_empty;
}
add_filter( 'wp_insert_post_empty_content', 'disable_save', 999999, 2 );
wp_insert_post_empty_content
がtrueに設定されているので、WordPressはタイトルも内容もないと考え、投稿の更新をやめます。
編集: /もっと短い変形は次のようになります。
add_filter( 'wp_insert_post_empty_content', '__return_true', PHP_INT_MAX -1, 2 );
https://wordpress.stackexchange.com/a/51980/31794 回答のコメントに記載されているように、wp_insert_post_empty_content
フィルターで挿入を停止する通知を受け取る理由は、次のとおりです。 post-new.php
の場合、自動ドラフトプロセスは、get_default_post_to_edit()
およびwp_insert_post()
を介して$post->ID
を取得し、$ postリターンからそのIDを使用する必要があります。つまり、「新しい投稿を追加」ページは、実際に毎回新しい「投稿レコード」を作成して取得します。
悲しいことに、予想される投稿IDの代わりに保存プロセスを停止すると、wp_insert_post()は0を返します。つまり、「wp_insert_post_empty_content」フィルターで「自動ドラフト」を停止することはできません。また、フィルタを使用する場合、悲しいことに「自動ドラフトを通過させてPHP通知を回避する必要があります。これはかなり悪いバグです。
無意味に新しい自動ドラフトレコードの作成を停止し、このバグを回避するために私が見つけた唯一の方法は、db.phpドロップインプラグインでwpdbクラスを拡張することです。
class wpdb_ext extends wpdb
{
function insert($table, $data, $format = null) {
if (isset($data['post_status']) && $data['post_status'] === "auto-draft" && ($pa = (int)$data['post_author'])
&& ($id = $this->get_var("SELECT ID FROM $table WHERE post_status = 'auto-draft' AND post_author = $pa LIMIT 1"))){
//fake insert id and return id of existing auto-draft as base for New post page.
return $this->insert_id = (int)$id;
}
return parent::insert($table, $data, $format = null);//else do actual insert
}
}
$wpdb = new wpdb_ext(DB_USER, DB_PASSWORD, DB_NAME, DB_Host);//overload wpdb
これにより、作成者ごとに1つの自動ドラフトのみが保持され、無意味なIDインクリメントの無駄/スキップを記録する無意味な新しい自動ドラフトが回避されます。