ある条件に一致した記事を自動的に「非公開」にする方法です。
今回の例は、「掲載終了日」という日付が入ったカスタムフィールドがあり、毎晩深夜に「掲載終了日」が過ぎた記事を「非公開」にする、というものです。
プログラムを作成し、サーバーのcron機能で自動実行させます(cronは、ほとんどのサーバーで用意されている自動実行機能です)
作成したプログラムはWordPressの外側に配置します。
プログラムコード
<?php
require_once('test_san/wp-load.php');
//非公開にする条件を設定
$day = date('Y/m/d');
$args = array(
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'カスタムフィールド名',
'value' => $day,
'compare' => '<'
),
),
'post_type' => 'カスタム投稿名',
'post_status' => 'publish',
'suppress_filters' => true );
//記事毎に非公開にする
$myposts = get_posts( $args );
if (!empty($myposts)) :
global $wpdb;
$table_prefix = $wpdb->prefix;
$tablename = $table_prefix . 'posts';
$to = get_option('admin_email');
foreach ( $myposts as $post ) : setup_postdata( $post );
$res = $wpdb->update(
$tablename,
array(
'post_status' => 'private'
),
array(
'ID' => $post->ID
),
array(
'%s'
),
array(
'%d'
)
);
if( 1 <= $res ) {
} else {//更新失敗
$subject = "非公開の処理に問題がありました。";
$send_content = home_url('/').$post->ID.'/'."\r\n\r\n".'記事タイトル:'.get_the_title($id)."\r\n\r\n".'手動で非公開にしてください。';
$message = $send_content;
$headers = "From: ".get_option('admin_email');
date_default_timezone_set('Asia/Tokyo');
if(mb_send_mail($to, $subject, $message, $headers, '-f'.$to)){
}else{
$file_path = __DIR__ . '/errorlog/error-'.$post->ID.'-'.date("Y_m_d-H_i_s").'.log';
file_put_contents($file_path, print_r($send_content, true));
}
}
endforeach;
endif;
wp_reset_postdata();
解説
1.wp-load.phpの読み込み(2行目)
WordPressの外側からWordPress関数を使用したりデータベースを操作できるようにwp-load.phpを読み込んでいます。
プログラムから相対的に見たwp-load.phpの場所を指定します。
2.非公開にしたい記事の条件を指定(5~18行目)
非公開にしたい記事の条件を指定しています。
WordPress関数「get_posts」に渡すパラメータです。
投稿タイプや条件を好きに指定できます。
今回は「掲載終了日<今日」という条件です。
この案件では、カスタムフィールド「掲載終了日」に「西暦4桁/月2桁/日2桁」という形で保存されているので、それに合わせて8行目の$day変数に「date('Y/m/d')」(今日)を入れています。
3.該当する記事が存在する場合処理を行う(21~62行目)
30~44行目
wpdbクラスのupdateメソッドを使ってデータベースの更新を行っています。
パラメータの意味は以下です。
1つ目:テーブル名2つ目:更新後のデータ3つ目:WHERE句に使うカラムと値4つ目:更新後のデータフォーマット5つ目:WHERE句の値のフォーマット
※%sは文字列、%dは整数
47~58行目
更新失敗した時の処理です。
管理者にメールを送っています。
実行時の注意点
データベースを更新するので、テスト環境でのテストランやデータベースのバックアップを忘れずに。
cronの設定
後は実行したいタイミングでcronの設定をします。
cronの書き方はサーバーによって異なります。



コメントを残す