web-dev-qa-db-ja.com

保存後処理を完全に無効にする

action/filterを使って保存プロセスを完全に無効にする方法が必要です。 queryposts_clauses、またはwp_insert_post/save_post/update_postフックで動作するもの(例えば:)。

これまでのところ、私はreturn '';だけを試みました。これは管理UIのポストオブジェクト部分の欠損値のためのたくさんのエラーを私に与えます。

これは「黙って」起こるはずなので、php_error/WP_DEBUGなどがTRUE/Onに設定されている場合でもエラーは発生しません。

ところで:私は ない 自動保存機能を無効にする方法を求めています。

4
kaiser
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 );
5
Rob Vermeer

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インクリメントの無駄/スキップを記録する無意味な新しい自動ドラフトが回避されます。

2
hexalys