サポート » 使い方全般 » ゴミ箱に移動するまえに下書き状態にしたい(actionの書き方)

  • 解決済 so-taro

    (@so-taro)


    投稿をゴミ箱から復元した際に、公開状態ではなく下書き状態にしようと思っています。
    ワードプレスの動作を確認すると、以下のようになっていました。

     ・下書きの投稿⇒削除⇒復元⇒下書き
     ・公開済の投稿⇒削除⇒復元⇒公開済

    そのため削除の時に、下書き状態にしてからゴミ箱へ移動すると良いと考え、以下のようなアクションフックを作成しましたが、うまく動きません。

    function my_before_delete_post( $post_id ){
    	$post->post_status == 'draft';
    	return $post;
    }
    add_action( 'before_delete_post', 'my_before_delete_post' );

    どうぞよろしくお願いします。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • こんにちは

    そのフックの動作については分からないですが、文法が間違っています。
    イコールが一つ多いです。

    
    $post->post_status = 'draft';
    

    これで意図した通りに動作するのかは分かりませんが・・・

    munyaguさん

    ご連絡ありがとうございます。
    やはりそもそも文法に間違いがあったのですね。ありがとうございます。

    尚、修正してみたのですが、意図したとおりに動かず、復元しても公開済みとなってしまいました。

    お分かりになる方またはアドバイスだけでも引き続き返信をお待ちしております。

    • この返信は2 年、 10 ヶ月前に  so-taro さんが編集しました。

    そのフックを使ったことは無いですが、気になる点としては、

    ■ $post を取得できているのかどうか。

    ■ add_actionを使っているのでアクションフックのようだが、
    my_before_delete_postは値を返す処理(フィルターフックみたいな処理)でよいのか。

    Codexによるとbefore_delete_postはゴミ箱を空にするときにだけ動作すると書かれています。

    It’s important to note the hook runs only when the WordPress user empties the Trash.

    https://codex.wordpress.org/Plugin_API/Action_Reference/before_delete_post

    ゴミ箱に移動するときはtrash_postの方が合ってそうな気がします。

    https://codex.wordpress.org/Plugin_API/Action_Reference/trash_post

    Mizunoさん、ikaringさん

    ご連絡ありがとうございます。

    Mizunoさんのご指摘通り、両方共きちんとできていなかったので修正しました。(たぶんこれであっていると思います。)
    またikaringさんのご指摘通り、trash_postが最適でした。きちんと読み込めていませんでした…のでこちらも修正しました。

    以下のとおり修正してみたのですが、やはり復元すると公開済みになってしまいます。

    function my_trash_post( $post_id ){
    	$post = get_post($post_id);
    	$post->post_status = 'draft';
    }
    add_action( 'wp_trash_post', 'my_trash_post' );

    引き続きのアドバイスをよろしくお願いいたします。

    ソースを見たところwp_trash_postはゴミ箱に送る前のフックで、trashed_postがゴミ箱に送ったあとのフックのようです。
    ソースを見てると、いくつかの設定をしているみたいなのでpost_statusをdraftにするだけで大丈夫なのかなと思うのですが、私にはちょっと分からないです。

    wp_trash_post()

    アクションフックを使うのであれば、データを更新する処理を書く必要があると思います。

    関数の中で$postを書き換えているだけなので、データベースのデータは変わっていない。

    こんにちは

    投稿をゴミ箱に移動したときにはpost_statusは’trash’になります。
    これを削除後のフックで’draft’に書き換えると、投稿は下書きになりますが、ゴミ箱には入りません。
    また、コアのソースを読むと削除時にppostmetaテーブルにデータが生成されるようですが、その情報と不整合になってしまいます。

    削除前のステータスはこの、削除時に生成されるpostmetaのデータに保持されています。
    ですのでこれを書き換えると、削除前に下書きにステータスを変更したかのように動作させることができます。

    function my_trashed_post( $post_id ){
    	global $wpdb;
    	$result = $wpdb->update(
    		$wpdb->postmeta,
    		array(
    			'meta_value' => 'draft'
    		),
    		array(
    			'post_id' => $post_id,
    			'meta_key' => '_wp_trash_meta_status'
    		)
    	);
    }
    add_action( 'trashed_post', 'my_trashed_post' );

    ※postmetaでは’_encloseme’や’_pingme’は複数レコード生成されますが、’_wp_trash_meta_status’はゴミ箱に移動時に生成されて復元されると削除されるため、常に1件しかデータがありません。
    ですので、第三引数の検索キーにはプライマリーキーであるmeta_idを含めていません。

    ikaringさん、Mizunoさん、munyaguさん

    ご連絡ありがとうございます。

    munyaguさんのコードで期待する動作を行うことができました。
    ありがとうございます!!

    昨夜、Mizunoさん、ikaringさんからご連絡頂いて、update_post_metaを利用して動作確認していたのですがうまくいかず、munyaguさんのコードで選んでいたフックが間違っていたのが判明しました。。。

    参考までに以下のコードでも「ゴミ箱から復元した時は必ず下書き状態」にすることができます。

    function my_trashed_post( $post_id ){
    	update_post_meta( $post_id, '_wp_trash_meta_status', 'draft' );
    }
    add_action( 'trashed_post', 'my_trashed_post' );

    なぜupdate_post_metaに思い至らなかったのか・・・そちらの方がシンプルでいいですね!

    今回の件で、フックやアクション、WordPress Developer Resourcesの使い方などが少しわかった気がします。
    アドバイスやコードの作成などありがとうございました!

    backdraftっていう名前だけのネタプラグインですが・・・アイデアぱくってすいません。

    https://ja.wordpress.org/plugins/backdraft/

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「ゴミ箱に移動するまえに下書き状態にしたい(actionの書き方)」には新たに返信することはできません。