自動生成等で数千記事~数万記事をストックしており、これを時間をおいて自動的に投稿させたい…という非常にニッチな状況下でのコードサンプルです。
管理画面に機能追加する形にしていますが、必要に応じてプラグイン化してもいいでしょう。
開発した経緯
自動投稿系のプラグインで使えそうなものがなかったため。また、あっても自動投稿が失敗するケースが多かったため。
使用方法とコードサンプル
子テーマのfunctions.phpに記述して上げなおしてください。管理画面上に「レビュー待ち投稿」「CSV予約投稿」の項目が出来ます。問題が生じても責任は取れないので必ずバックアップを取ってから作業してください。
では実際のコードです。すべてfunctions.phpに記述します。
ステップ1: カスタム管理ページの追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function my_custom_menu_page(){ ?> <div class="wrap"> <h2>レビュー待ちの投稿をダウンロード</h2> <form method="post" action=""> <input type="hidden" name="download_csv" value="true"/> <input type="submit" class="button button-primary" value="CSVダウンロード"/> </form> </div> <?php } function add_my_custom_menu(){ add_menu_page('レビュー待ち投稿', 'レビュー待ち投稿', 'manage_options', 'custom-menu-page', 'my_custom_menu_page'); } add_action('admin_menu', 'add_my_custom_menu'); |
ステップ2: データの取得とCSVファイルの生成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
function download_pending_posts_as_csv(){ if(isset($_POST['download_csv']) && $_POST['download_csv'] == 'true'){ global $wpdb; $filename = 'pending_posts.csv'; header("Content-type: text/csv"); header("Content-Disposition: attachment; filename={$filename}"); header("Pragma: no-cache"); header("Expires: 0"); $output = fopen("php://output", "w"); // CSVヘッダー fputcsv($output, array('記事ID', '記事タイトル')); $posts = get_posts(array( 'post_status' => 'pending', 'posts_per_page' => -1, )); foreach($posts as $post){ fputcsv($output, array($post->ID, $post->post_title)); } fclose($output); exit; } } add_action('admin_init', 'download_pending_posts_as_csv'); |
もし「下書き」を対象にする場合は‘post_status’のpendingをdraftに変更してください。またanyにすればステータスに関係なくすべての記事を取得できます。今回は投稿日時を変更するだけなので記事IDと記事タイトルだけを取得するようにしていますが、タグやカテゴリ、投稿者、記事本文なども出力させることもできます。このあたりは別のプラグインを探した方が早いです。
ステップ3: CSVアップロードフォームの追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function my_custom_csv_upload_page(){ ?> <div class="wrap"> <h2>CSVで予約投稿設定</h2> <form method="post" enctype="multipart/form-data"> <input type="file" name="csv_file" accept=".csv" required/> <input type="submit" class="button button-primary" value="アップロード"/> </form> </div> <?php } function add_my_custom_csv_upload_menu(){ add_menu_page('CSV予約投稿', 'CSV予約投稿', 'manage_options', 'custom-csv-upload-menu', 'my_custom_csv_upload_page'); } add_action('admin_menu', 'add_my_custom_csv_upload_menu'); |
ステップ4: アップロードされたCSVの処理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
function handle_csv_upload(){ if(isset($_FILES['csv_file'])){ $file = $_FILES['csv_file']; // ファイルのバリデーション(CSVのみ受け入れる) if($file['type'] != 'text/csv'){ echo '<div class="error"><p>CSVファイルのみアップロードしてください。</p></div>'; return; } // CSVファイルを開く $handle = fopen($file['tmp_name'], 'r'); while(($data = fgetcsv($handle)) !== FALSE){ $post_id = $data[0]; $scheduled_date = DateTime::createFromFormat('Y/m/d H:i', $data[2]); if(!$scheduled_date){ continue; // 日付形式が不正な場合はスキップ } // 投稿の予約日時を更新 $post_data = array( 'ID' => $post_id, 'post_status' => 'future', 'post_date' => $scheduled_date->format('Y-m-d H:i:s'), 'edit_date' => true ); wp_update_post($post_data); } fclose($handle); echo '<div class="updated"><p>予約投稿が設定されました。</p></div>'; } } add_action('admin_init', 'handle_csv_upload'); |
CSVはUTF-8のbom無しを推奨。ダウンロードしたCSVの3列目に2022/01/01 01:12の形式で日付を記入してアップロードしてください。このあたりはエクセルをうまく使えば、数年分を一気に設定なんてことも可能です。
自分の環境では特に問題は出ていませんが、数記事程度でまずは試してみてください。
コメント