category

category

wordpress

2025.4.15

2025.4.18

31

【WordPress】条件に一致した記事を、定期処理で自動的に「非公開」にする方法

ある条件に一致した記事を自動的に「非公開」にする方法です。

今回の例は、「掲載終了日」という日付が入ったカスタムフィールドがあり、毎晩深夜に「掲載終了日」が過ぎた記事を「非公開」にする、というものです。

プログラムを作成し、サーバーの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の書き方はサーバーによって異なります。

861

コメント

コメントを残す

ニックネームは公開されます

CAPTCHA


閉じる