web-dev-qa-db-ja.com

特定の日付(たとえば、2017年4月以前)の間で投稿の一括公開を解除しますか?

サイトからの一連の投稿を非公開(ドラフトに設定)する必要がありますが、特定の期間内(つまり、特定の日付内ですべての投稿を非公開にしたくない)。

この場合、日付は基本的に2017年4月以前の投稿であり、ドラフトに設定する必要があります。

これが、私がベースとして始めているスクリプトと、これまでに取っているアプローチです。このファイル「wp-includes/plugin.php」に「アクションの追加」オプションを追加しています。日付範囲内の投稿をターゲットにするにはどうすればよいですか?

    add_action('admin_ini','custom_function');

    function custom_function(){
    $args = array('post_type'=> 'post',
         'post_status' => 'publish',
         'posts_per_page'=>-1
    );
    $published_posts = get_posts($args);

    foreach($published_posts as $post_to_draft){
       $query = array(
        'ID' => $post_to_draft->ID,
        'post_status' => 'draft',
       );
       wp_update_post( $query, true );
    }
}
1
Michael Teller

2つのコマンドをチェーン化することにより、WP CLIを使用してコードを記述することなくこれを実行できます。

  • 2017年4月以前のすべての投稿を取得するコマンド
  • すべての投稿を更新し、post_statusをdraftに設定するコマンド

2017年4月より前のすべての投稿の取得

wp post listを使用してこれを行うことができ、次のコマンドに渡すための投稿IDとして必要になります。 このコマンドの詳細はこちら

たとえば、2017年のすべての投稿を次のように取得できます。

wp post list --year="2017" --format=ids

そして、4月からのすべての投稿は次のようになります。

wp post list --year="2017" --month="4" --format=ids

このようにして、2017年の各月、およびその前の年ごとにこのコマンドを実行し、結果を次のコマンドに渡すことができます

投稿を下書きに設定する

これを行うには、wp post update 123を使用します。123は、変更する投稿のIDです

wp post update 123 --post_status="draft"

2つをまとめる

2016年のすべての投稿を下書きに設定します。

wp post update $(wp post list --year="2016" --format=ids) --post_status="draft"

そして2015年:

wp post update $(wp post list --year="2015" --format=ids) --post_status="draft"

そして2014:

wp post update $(wp post list --year="2014" --format=ids) --post_status="draft"

一般的注意事項

  • WP CLIを介してこれを実行する必要があります。すべてのadmin_initフックで実行すると処理が遅くなり、制限時間に達する前に実行を完了できない場合、サイトWP Adminをロードしません
  • すべてを要求するクエリはサイトにとって悪いものであり、データベースを損なったり、メモリ不足の警告をトリガーしたりする可能性があります。常に100以下のバッチで投稿を取得します。いつでも2番目と3番目のクエリを実行できます。一度にすべてを取得しないでください。
  • wp-includesまたはwp-adminのファイルを決して変更しないでください。 WPが更新されると、すべての変更が上書きされます。それは災害のレシピです。 2012年にサイトがハッキングされ、顧客データをリリースし、テーマとプラグインを使用する代わりにWP Coreを変更し、それを更新して新しいセキュリティを取得できなかったため、会社に数百万ドルの罰金を科しました修正し、大したことではないと思った
  • WP_Queryの代わりにget_postsを使用します。デフォルトでキャッシュを使用し、実際のポストループに近い
  • 適切にインデントし、インデントするエディターを取得します。これにより、クラスのバグやミスがすべて解決されます。
  • 問題の解決策を思いついたXYの質問をし、それを実装する方法がわからず、解決策を実装する方法を尋ねました。問題を解決する方法を尋ねるべきでした。もしあれば、可能な答えの全リストが掲載されていたかもしれませんが、今はできません。例えば。 pre_get_postsを使用して、2017年4月より前に投稿を非表示にします(問題は解決しますが、求めていたものではありません)
1
Tom J Nowell