サイトからの一連の投稿を非公開(ドラフトに設定)する必要がありますが、特定の期間内(つまり、特定の日付内ですべての投稿を非公開にしたくない)。
この場合、日付は基本的に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 );
}
}
2つのコマンドをチェーン化することにより、WP CLIを使用してコードを記述することなくこれを実行できます。
draft
に設定するコマンド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"
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"
等
admin_init
フックで実行すると処理が遅くなり、制限時間に達する前に実行を完了できない場合、サイトWP Adminをロードしませんwp-includes
またはwp-admin
のファイルを決して変更しないでください。 WPが更新されると、すべての変更が上書きされます。それは災害のレシピです。 2012年にサイトがハッキングされ、顧客データをリリースし、テーマとプラグインを使用する代わりにWP Coreを変更し、それを更新して新しいセキュリティを取得できなかったため、会社に数百万ドルの罰金を科しました修正し、大したことではないと思ったWP_Query
の代わりにget_posts
を使用します。デフォルトでキャッシュを使用し、実際のポストループに近いpre_get_posts
を使用して、2017年4月より前に投稿を非表示にします(問題は解決しますが、求めていたものではありません)