動画まとめサイトのアイキャッチ画像を自動で設定するPHPプログラム

動画まとめサイト

今回は動画まとめサイトの記事に設定するアイキャッチ画像を、ダウンロードする所からアップロードして記事に設定する所までをPHPのプログラムに自動でやって貰おうと思います。

YouTubeからサムネイルをダウンロードしてワードプレス記事に登録する作業を、一つ一つ手で行っていたらどれくらい時間が掛かるのか測ってみました。サムネのDLから記事のアイキャッチ設定までを手作業で行うと約2分掛かりました

動画まとめサイトを1日に10記事更新する前提でこの2分の手作業を自動化すると、月間で10時間・年間で約122時間も節約する事ができます。前回解説したカテゴリ・タグの自動付与と合わせれば、月間で25時間・年間で304時間もの作業時間を減らす事ができるんです。約12日分の時間ですよ、すごくないですか??

ではどうやってPHPプログラムでアイキャッチ画像を設定するのか解説していきます。

ワードプレスの記事アイキャッチの仕組み

ワードプレス記事にアイキャッチを自動で設定するには「画像ファイルの取得」「画像ファイル保存先の作成」「画像ファイルの保存」「記事IDと画像ファイルの紐付けデータ作成」の4つのステップで処理が必要です。

画像ファイルの取得以外の処理は、ワードプレスのエディタで「投稿の編集 > アイキャッチの設定」から画像をアップロードしアイキャッチとして設定する時に自動で行われていますが、YouTubeの動画サムネイルを自動で記事アイキャッチとして設定したいので、PHPプログラムで外部から必要な処理を行います。

それでは必要なステップを1つずつ見ていきましょう。

YouTube APIから動画サムネイルのURLを取得する

今まで作ってきた通り、動画まとめサイトに必要なデータはすべてYouTube APIから取得できるので、動画サムネイルのURLをYouTube APIから抽出して使用します。これまでの解説記事で動画IDや動画タグを取得してデータベースに保存する方法を紹介してきましたが、今回のサムネイルも手順は同じです。

まずはワードプレスの記事テーブルにサムネイルURLを保存するカラムを作って行きます。

動画サムネイルのURLを保存するカラムを記事テーブルに作成

サムネイルURLを記事テーブルに保存するため「thumb_url」というカラムを記事テーブルに追加します。記事テーブルへのカラム追加に関してはこちらの記事でも解説しているので参考にして下さい。

YouTube APIからサムネイルURLを取得するPHPプログラム

カラムにサムネイルURLを入れるPHPプログラムはサンプルソースコードに追記しますが、コードがかなり長くなってきましたので当記事の最後にまとめて掲載しておきます。追記内容は簡単で下記の2点だけです。

  • 11行目のINSERT文に「thumb_url」カラムを追加
  • 115行目で「thumb_url」カラムに追加する値をYouTube APIの中から指定

ワードプレス記事に動画サムネイルを設定する

ここまでで動画サムネイルのURLは準備できました。次はこのURLを使って画像を取得し外部からワードプレスのメディアとしてアップロードしていきます。記事サムネイルとして設定できるまでにいくつかステップがありますが、手順が抜けないようにじっくり作業してみて下さい。

サムネイル処理用のPHPファイルを作成

今までに作成してきたPHPプログラムは「00_youtube_api_movie_info.php」に記載してきましたが、中身が長くなってきましたし役割も違うので「01_thumbnail_process.php」というPHPファイルを別に作成し、こっちにプログラムを書いていきます。

本来は役割でファイルを分けるなら「00_youtube_api_movie_info.php」もいくつか分けられますが、ファイル間でのデータのやり取りが手間だったりするので、まとめてしまっています。気になる方は自分が使いやすいようにファイルを分けてカスタマイズして下さいね。

記事アイキャッチの保存先フォルダの作成

ワードプレスに画像をアップロードすると「/home/ユーザー名/public_html/ドメイン名/wp-content/uploads」内に保存されますが、この時に保存先の対象年月が存在しない場合(次の年月に変わって最初のアップロード時)、自動で保存先の年月フォルダが作成されます。

外部から画像をアップロードするには、まず上記と同じ作業をPHPプログラムで行い保存先フォルダを作成する必要があります。サンプルコードはこんな感じで書いてみました。

<?php

//フォルダの準備
$year = date("Y");
$month = date("m");
$filename_year = "/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/";
$filename_month = "/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/";

//保存先のフォルダの確認・作成
if (file_exists($filename_year)) {
    if (file_exists($filename_month)) {
        //ここから処理書く
        print(年月フォルダあり);
        //ここまで
    } else {
        mkdir("/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/", 0755);
        //ここから処理書く
        print(年フォルダだけあり);
        //ここまで
    }
} else {
    mkdir("/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/", 0755);
    mkdir("/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/", 0755);
    //ここから処理書く
    print(年月フォルダなし);
    //ここまで
}

?>

仕組みを簡単に説明すると、file_exists関数で対象の年月フォルダの有無を確認し、if関数でフォルダがある場合と無い場合の処理を指定しています。対象の年月フォルダが無い場合は、mkdir関数でパスを指定しフォルダを作成しています。

file_get_contents関数で動画サムネイルを取得

保存先のフォルダを確保した後は、先ほど記事テーブルに保存した動画サムネイルurlから画像データを取得します。今回はfile_get_contents関数を使用して画像データを取得し$img変数にデータを格納してみます。コードはこんな感じです。

$img = file_get_contents('https://i.ytimg.com/vi/8o5bHSe2OPg/hqdefault.jpg');

file_put_contents関数で動画サムネイルをアップロード

お次はfile_put_contents関数を使って指定したフォルダに画像データを保存していきます。file_get_contents関数とセットで使用します。保存する画像の名前は、重複せず使いやすいように動画IDをそのままサムネイルの名前として使用しています。

//画像の準備
$img = file_get_contents('https://i.ytimg.com/vi/8o5bHSe2OPg/hqdefault.jpg');
$fileName = "/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/8o5bHSe2OPg.jpg";

file_put_contents($fileName, $img);

これでただの文字列だったサムネイルURLから画像データを取得し、指定したディレクトリに画像データを入れる事ができました。しかしこのままでは、ワードプレス内で使用できるメディアとして認識されていないので、必要な紐付け情報を作成して各テーブルに追加していきます。

自動生成されない不足データを追加する

プログラムで追加したため自動で作成されない一部のデータは自分で用意し、適切にテーブルに追加しなければなりません。必要な4つのデータを下記の表にまとめました。

テーブル内容本来の作成タイミング
wp**_post画像の投稿データ画像ファイル投稿時
wp**_postmeta画像のmetaデータ(パス)画像ファイル投稿時
wp**_postmeta画像のmetaデータ(サイズ)画像ファイル投稿時
wp**_postmeta記事と画像の紐づけデータエディタでアイキャッチを設定し保存

このように、画像ファイルをワードプレスに投稿(サーバーにアップ)したタイミングで生成される3つの画像関連のデータと、記事にアイキャッチを設定した際に生成される1つの紐づけデータが不足しています。これらを補うPHPプログラムで補完して行きます。

画像の投稿データとmetaデータをテーブルに追加

まずは画像アップロード時の不足データを準備して行きましょう。画像の投稿データを「wp**_post」に追加し、画像のサイズとパスの情報を「wp**_postmeta」に追加していきます。サンプルはこんな感じで書いてみました。

try {
  $db = new PDO('mysql:host=localhost;dbname=DB名;charset=utf8', 'DBのユーザー名', 'DBのパスワード');
} catch(PDOException $e) {
  die('エラーメッセージ:'.$e->getMessage());
}

$stt1 = $db->prepare("INSERT INTO wp**_posts ( post_author, post_date, post_date_gmt, post_title, post_status, post_name, post_modified, post_modified_gmt, guid, post_type, post_mime_type, movie_id ) VALUES ( :post_author, :post_date, :post_date_gmt, :post_title, :post_status, :post_name, :post_modified, :post_modified_gmt, :guid, :post_type, :post_mime_type, :movie_id )");
$stt2 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");
$stt3 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");

//WPメディアpostデータ生成
$stt1->bindValue(':post_author', 1 );
$stt1->bindValue(':post_date', '今日の日付');
$stt1->bindValue(':post_date_gmt', 'グリニッジで今日の日付' );
$stt1->bindValue(':post_title', '動画ID');
$stt1->bindValue(':post_status', 'inherit');
$stt1->bindValue(':post_name', str_replace(" ", "-", '動画ID') );
$stt1->bindValue(':post_modified', '今日の日付' );
$stt1->bindValue(':post_modified_gmt', 'グリニッジで今日の日付' );
$stt1->bindValue(':guid', "画像ファイルへのパス" );
$stt1->bindValue(':post_type', 'attachment' );
$stt1->bindValue(':post_mime_type', 'image/jpeg' );
$stt1->bindValue(':movie_id', 'thumb_'.動画ID );
$stt1->execute();
$media_post_id = $db->lastInsertId('ID');

//WPメディアmetaデータ生成
$stt2->bindValue(':post_id', '画像の投稿ID' );
$stt2->bindValue(':meta_key', "_wp_attached_file" );
$stt2->bindValue(':meta_value', "画像ファイルへのパス" );
$stt2->execute();

$size = getimagesize($fileName);
$image_mata = array(
    'width' => $size[0],
    'height' => $size[1],
    'file' => "画像ファイルへのパス",
    'sizes' => array(
        'wellington-thumbnail-small' => array(
            'file' => '',
            'width' => 0,
            'height' => 0,
            'mime-type' => 'image/jpeg',
        ),
        'wellington-thumbnail-medium' => array(
            'file' => '',
            'width' => 0,
            'height' => 0,
            'mime-type' => 'image/jpeg',
        ),
    ),
    'image_meta' => array(
        'aperture' => '0',
        'credit' => '',
        'camera' => '',
        'caption' => '',
        'created_timestamp' => '0',
        'copyright' => '',
        'focal_length' => '0',
        'iso' => '0',
        'shutter_speed' => '0',
        'title' => '',
        'orientation' => '0',
        'keywords' => array(
        ),
    ),
);

$stt3->bindValue(':post_id', '画像の投稿ID' );
$stt3->bindValue(':meta_key', "_wp_attachment_metadata" );
$stt3->bindValue(':meta_value', serialize($image_mata) );
$stt3->execute();

記事とアイキャッチの紐づけデータをテーブルに追加

次は記事と画像の紐付ける重要なレコードを「wp**_postmeta」に追加します。サンプルはこんな感じです。

try {
  $db = new PDO('mysql:host=localhost;dbname=DB名;charset=utf8', 'DBのユーザー名', 'DBのパスワード');
} catch(PDOException $e) {
  die('エラーメッセージ:'.$e->getMessage());
}

$stt4 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");
$stt5 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");

//記事とサムネイルの紐づけデータ作成
$stt4->bindValue(':post_id', '記事ID' );
$stt4->bindValue(':meta_key', "_thumbnail_id" );
$stt4->bindValue(':meta_value', '画像の投稿ID' );
$stt4->execute();
            
$stt5->bindValue(':post_id', '記事ID' );
$stt5->bindValue(':meta_key', "_wp_page_template" );
$stt5->bindValue(':meta_value', "default" );
$stt5->execute();

サンプルソースコードまとめ

動画まとめサイトを自動投稿するために作成した2つのファイルを掲載します。コピペで動くように作りましたので必要な方は活用して下さい。僕もよくやってしまいますが、ユーザー名とかテーブル名のリネームは忘れずに行って下さいね。

記事アイキャッチ自動付与プログラム

アイキャッチの自動付与に必要な機能を細かく説明してきましたが、ここまでのコードを「01_thumbnail_process.php」にまとめて記述するとこんな感じになります。

<?php

include(dirname(__FILE__) . '/functions.php');
$today = date("Y-m-d 00:00:00");
$gmt_today = gmdate("Y-m-d 00:00:00");

try {
  $db = new PDO('mysql:host=localhost;dbname=DB名;charset=utf8', 'DBのユーザー名', 'DBのパスワード');
} catch(PDOException $e) {
  die('エラーメッセージ:'.$e->getMessage());
}

$stt0 = $db->prepare("SELECT * FROM wp**_posts WHERE post_date >= '{$today}' and post_type = 'post' ");
$stt1 = $db->prepare("INSERT INTO wp**_posts ( post_author, post_date, post_date_gmt, post_title, post_status, post_name, post_modified, post_modified_gmt, guid, post_type, post_mime_type, movie_id ) VALUES ( :post_author, :post_date, :post_date_gmt, :post_title, :post_status, :post_name, :post_modified, :post_modified_gmt, :guid, :post_type, :post_mime_type, :movie_id )");
$stt2 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");
$stt3 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");
$stt4 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");
$stt5 = $db->prepare("INSERT INTO wp**_postmeta ( post_id, meta_key, meta_value ) VALUES ( :post_id, :meta_key, :meta_value )");

$stt0->execute();
while ($row0 = $stt0->fetch()) {
 
    //フォルダの準備
    $year = date("Y");
    $month = date("m");
    $filename_year = "/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/";
    $filename_month = "/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/";

    //画像の準備
    $img = file_get_contents($row0['thumb_url']);
    $fileName = "/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/{$row0['movie_id']}.jpg";

    //保存先のフォルダの作成・画像保存
    if (file_exists($filename_year)) {
        if (file_exists($filename_month)) {
            file_put_contents($fileName, $img);
        } else {
            mkdir("/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/", 0755);
            file_put_contents($fileName, $img);
        }
    } else {
        mkdir("/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/", 0755);
        mkdir("/home/ユーザー名/public_html/ドメイン名/wp-content/uploads/{$year}/{$month}/", 0755);
        file_put_contents($fileName, $img);
    }

    //WPメディアpostデータ生成
    $stt1->bindValue(':post_author', 1 );
    $stt1->bindValue(':post_date', $today );
    $stt1->bindValue(':post_date_gmt', $gmt_today );
    $stt1->bindValue(':post_title', $row0['movie_id']);
    $stt1->bindValue(':post_status', 'inherit');
    $stt1->bindValue(':post_name', str_replace(" ", "-", $row0['movie_id']) );
    $stt1->bindValue(':post_modified', $today );
    $stt1->bindValue(':post_modified_gmt', $gmt_today );
    $stt1->bindValue(':guid', "https://dog.diypro.work/wp-content/uploads/{$year}/{$month}/{$row0['movie_id']}.jpg" );
    $stt1->bindValue(':post_type', 'attachment' );
    $stt1->bindValue(':post_mime_type', 'image/jpeg' );
    $stt1->bindValue(':movie_id', 'thumb_'.$row0['movie_id'] );
    $stt1->execute();
    $media_post_id = $db->lastInsertId('ID');

    //WPメディアmetaデータ生成
    $stt2->bindValue(':post_id', $media_post_id );
    $stt2->bindValue(':meta_key', "_wp_attached_file" );
    $stt2->bindValue(':meta_value', "{$year}/{$month}/{$row0['movie_id']}.jpg" );
    $stt2->execute();

    $size = getimagesize($fileName);
    $image_mata = array(
        'width' => $size[0],
        'height' => $size[1],
        'file' => "{$year}/{$month}/{$row0['movie_id']}.jpg",
        'sizes' => array(
            'wellington-thumbnail-small' => array(
                'file' => '',
                'width' => 0,
                'height' => 0,
                'mime-type' => 'image/jpeg',
            ),
            'wellington-thumbnail-medium' => array(
                'file' => '',
                'width' => 0,
                'height' => 0,
                'mime-type' => 'image/jpeg',
            ),
        ),
        'image_meta' => array(
            'aperture' => '0',
            'credit' => '',
            'camera' => '',
            'caption' => '',
            'created_timestamp' => '0',
            'copyright' => '',
            'focal_length' => '0',
            'iso' => '0',
            'shutter_speed' => '0',
            'title' => '',
            'orientation' => '0',
            'keywords' => array(
            ),
        ),
    );

    $stt3->bindValue(':post_id', $media_post_id );
    $stt3->bindValue(':meta_key', "_wp_attachment_metadata" );
    $stt3->bindValue(':meta_value', serialize($image_mata) );
    $stt3->execute();
    
    //記事とサムネイルの紐づけデータ作成
    $stt4->bindValue(':post_id', $row0['ID'] );
    $stt4->bindValue(':meta_key', "_thumbnail_id" );
    $stt4->bindValue(':meta_value', $media_post_id );
    $stt4->execute();
            
    $stt5->bindValue(':post_id', $row0['ID'] );
    $stt5->bindValue(':meta_key', "_wp_page_template" );
    $stt5->bindValue(':meta_value', "default" );
    $stt5->execute();

}

?>

後は「01_thumbnail_process.php」を実行して、ワードプレスの記事エディタから記事にアイキャッチが設定されているか確認して下記のようになっていれば成功です。

記事自動生成プログラム

今までの解説記事で追記してきた「00_youtube_api_movie_info.php」の完成版も掲載しておきます。

<?php

include(dirname(__FILE__) . '/functions.php');

try {
  $db = new PDO('mysql:host=localhost;dbname=DB名;charset=utf8', 'DBのユーザー名', 'DBのパスワード');
} catch(PDOException $e) {
  die('エラーメッセージ:'.$e->getMessage());
}

$stt = $db->prepare("INSERT IGNORE INTO wp**_posts ( post_author, post_date, post_date_gmt, post_content, post_title, movie_tags, post_status, post_modified, post_modified_gmt, movie_id, thumb_url ) VALUES ( :post_author, :post_date, :post_date_gmt, :post_content, :post_title, :movie_tags, :post_status, :post_modified, :post_modified_gmt, :movie_id, :thumb_url )");

$dog_category = array('アメリカンコッカースパニエル', 'コーギー', 'ゴールデンレトリバー');

foreach($dog_category as $value){

    $option = array(
    
        //apiキー
        'key' => 'APIキー',
    
        //必須パラメータ:id or snippet
        'part' => 'snippet',
    
        //フィルタ:最大1個まで
        'forContentOwner' => null,
        'forMine' => null,
        'relatedToVideoId' => null,

        //省略可能なパラメータ
        'channelId' => null,
        'channelType' => null,
        'eventType' => null,
        'maxResults' => '1',
        'onBehalfOfContentOwner' => null,
        'order' => 'relevance',
        'pageToken' => null,
        'publishedAfter' => null,
        'publishedBefore' => null,
        'q' => $value,
        'regionCode' => 'JP',
        'safeSearch' => null,
        'topicId' => null,
        'type' => 'video',
        'videoCaption' => null,
        'videoCategoryId' => '15',
        'videoDefinition' => null,
        'videoDimension' => null,
        'videoDuration' => null,
        'videoEmbeddable' => null,
        'videoLicense' => null,
        'videoSyndicated' => null,
        'videoType' => null
    
    );
    
    $search_url = "https://www.googleapis.com/youtube/v3/search?".http_build_query($option, '&');
    $decode_search_url = array(htmlspecialchars_decode( $search_url ));
    
    $api_content = youtube_api_get($decode_search_url);

    //print_r($api_content);
    
    $video_count = $api_content[0]["pageInfo"]["resultsPerPage"];
    
    for ($j = 0; $j< $video_count; $j++) {
        
        $video_option = array(
            
            //apiキー
            'key' => 'APIキー',
        
            //フィルタ
            'chart' => null,
            'id' => $api_content[0]["items"][$j]["id"]["videoId"],
            'myRating' => null,
        
            //任意のフィルタ
            'maxResults' => null,
            'onBehalfOfContentOwner' => null,
            'nextPageToken' => null,
            'regionCode' => null,
            'videoCategoryId' => null,
        
            //指定可能のレスポンス:
            'part' => 'snippet,contentDetails,statistics,player,topicDetails,recordingDetails'
        );
    
        $video_url = "https://www.googleapis.com/youtube/v3/videos?".http_build_query($video_option, 'a', '&');
        $decode_video_url = array(htmlspecialchars_decode( $video_url ));
        $video_api_content = youtube_api_get($decode_video_url);
        print_r($video_api_content);
        
        $stt->bindValue(':post_author', 1);
        $stt->bindValue(':post_date', date("Y/m/d"));
        $stt->bindValue(':post_date_gmt', date("Y/m/d"));
        $stt->bindValue(':post_content', $video_api_content[0]["items"][0]["snippet"]["description"]);
        $stt->bindValue(':post_title', $api_content[0]["items"][$j]["snippet"]["title"]);
        
        if(isset($video_api_content[0]["items"][0]["snippet"]["tags"])){
            $tag_count = count($video_api_content[0]["items"][0]["snippet"]["tags"]);
            $tags = null;
            for ($tc = 0; $tc < $tag_count; $tc++) {
                $tags .= $video_api_content[0]["items"][0]["snippet"]["tags"][$tc].",";
            }
        } else {
            $tags = null;
        }
        
        $stt->bindValue(':movie_tags', $tags);
        $stt->bindValue(':post_status', 'draft');
        $stt->bindValue(':post_modified', date("Y/m/d"));
        $stt->bindValue(':post_modified_gmt', date("Y/m/d"));
        $stt->bindValue(':movie_id', $api_content[0]["items"][$j]["id"]["videoId"]);
        $stt->bindValue(':thumb_url', $api_content[0]["items"][$j]["snippet"]["thumbnails"]["high"]["url"]);
        $stt->execute();
        
        //カテゴリの付与
        $post_id = $db->lastInsertId('ID');

        $stt1 = $db->prepare("SELECT * FROM wp**_terms WHERE name = '{$value}' ");
        $stt1->execute();
        $row1 = $stt1->fetch();
        
        $stt2 = $db->prepare("SELECT * FROM wp**_term_taxonomy WHERE term_id = '{$row1['term_id']}' ");
        $stt2->execute();
        $row2 = $stt2->fetch();
        
        $stt3 = $db->prepare("INSERT IGNORE INTO wp**_term_relationships ( object_id, term_taxonomy_id ) VALUES ( :object_id, :term_taxonomy_id )");
        $stt3->bindValue(':object_id', $post_id);
        $stt3->bindValue(':term_taxonomy_id', $row2['term_taxonomy_id']);
    	$stt3->execute();
    	
    	//タグの付与
        unset($post_tags);
        $post_tags = array();
        
        if(preg_match('/(笑)|(面白)|(おもしろ)|(楽しい)/', $video_api_content[0]["items"][0]["snippet"]["description"])){array_push($post_tags, "おもしろいぬ");}
        if(preg_match('/(しつけ)|(頭いい)|(芸)|(かしこい)|(賢い)/', $video_api_content[0]["items"][0]["snippet"]["description"])){array_push($post_tags, "かしこいぬ");}
        if(preg_match('/(可愛い)|(かわいい)|(カワイイ)|(キュート)|(プリティ)|(癒し)|(和む)/', $video_api_content[0]["items"][0]["snippet"]["description"])){array_push($post_tags, "かわいいぬ");}
        if(preg_match('/(超)|(凄い)|(すごい)/', $video_api_content[0]["items"][0]["snippet"]["description"])){array_push($post_tags, "すごいぬ");}
        if(preg_match('/(眠)|(寝)|(ねむい)/', $video_api_content[0]["items"][0]["snippet"]["description"])){array_push($post_tags, "ねむいぬ");}
        
        if(preg_match('/(笑)|(面白)|(おもしろ)|(楽しい)/', $api_content[0]["items"][$j]["snippet"]["title"])){array_push($post_tags, "おもしろいぬ");}
        if(preg_match('/(しつけ)|(頭いい)|(芸)|(かしこい)|(賢い)/', $api_content[0]["items"][$j]["snippet"]["title"])){array_push($post_tags, "かしこいぬ");}
        if(preg_match('/(可愛い)|(かわいい)|(カワイイ)|(キュート)|(プリティ)|(癒し)|(和む)/', $api_content[0]["items"][$j]["snippet"]["title"])){array_push($post_tags, "かわいいぬ");}
        if(preg_match('/(超)|(凄い)|(すごい)/', $api_content[0]["items"][$j]["snippet"]["title"])){array_push($post_tags, "すごいぬ");}
        if(preg_match('/(眠)|(寝)|(ねむい)/', $api_content[0]["items"][$j]["snippet"]["title"])){array_push($post_tags, "ねむいぬ");}
    
        if(preg_match('/(笑)|(面白)|(おもしろ)|(楽しい)/', $tags)){array_push($post_tags, "おもしろいぬ");}
        if(preg_match('/(しつけ)|(頭いい)|(芸)|(かしこい)|(賢い)/', $tags)){array_push($post_tags, "かしこいぬ");}
        if(preg_match('/(可愛い)|(かわいい)|(カワイイ)|(キュート)|(プリティ)|(癒し)|(和む)/', $tags)){array_push($post_tags, "かわいいぬ");}
        if(preg_match('/(超)|(凄い)|(すごい)/', $tags)){array_push($post_tags, "すごいぬ");}
        if(preg_match('/(眠)|(寝)|(ねむい)/', $tags)){array_push($post_tags, "ねむいぬ");}
        
        $unique_post_tags = array_values(array_unique($post_tags));
        $tags_count = count($unique_post_tags);
    
        for ($j = 0; $j< $tags_count; $j++) {

            $stt4 = $db->prepare("SELECT * FROM wp**_terms WHERE name = '{$unique_post_tags[$j]}' ");
            $stt4->execute();
            $row4 = $stt4->fetch();
        
            $stt5 = $db->prepare("SELECT * FROM wp**_term_taxonomy WHERE term_id = '{$row4['term_id']}' ");
            $stt5->execute();
            $row5 = $stt5->fetch();
        
            $stt6 = $db->prepare("INSERT IGNORE INTO wp**_term_relationships ( object_id, term_taxonomy_id ) VALUES ( :object_id, :term_taxonomy_id )");
            $stt6->bindValue(':object_id', $post_id);
            $stt6->bindValue(':term_taxonomy_id', $row5['term_taxonomy_id']);
    		$stt6->execute();

        }

    } // for $j

}

?>

自動でサムネイルを設定するためcronに登録

最後に作成した「01_thumbnail_process.php」を自動実行させるためにcronに登録します。ただし、このサムネイルの設定処理は事前に記事データを生成する「00_youtube_api_movie_info.php」の処理が終わっていないといけないので、ファイルの実行は5分後に設定しています。

cornについては下記の記事で詳しく説明していますので、一読をオススメします。

まとめ

今回の記事で自動更新型の動画まとめサイトの作り方は終了です。あまり教えてくれないバックグラウンドの処理の部分にスポットを当てて解説してみましたがいかがだったでしょうか。後はテンプレートなどのフロントエンドの部分を見栄え良く整えれば、しっかりした動画まとめサイトができると思います。

せっかくあらゆる情報が簡単に手に入る時代ですので、動画まとめサイトだけではなく色々なサイトを自作して、これからも楽しいDIYプログラミングライフを送りましょう!

投げ銭はこちら(*‘∀‘)
僕はいつも晩酌しながら記事を書いてるんですが、もしこの記事が面白かったら一杯おごって貰えませんか(*ノωノ) お酒パワーがあれば次の記事も頑張って書けます!
炭酸系はちょっと苦手で日本酒とウィスキーが好きです!オススメがあればメッセージで教えて下さい('ω')ノ
nagesen@diy-programming.site → amazonギフト券

youtubeの動画を自動で投稿するwpプラグイン完成!

当サイトで解説しているyoutube動画まとめサイト作成のノウハウを元に、誰でも簡単に動画まとめサイトが作れるwpプラグインを作りました。

主な機能なこんな感じです。

  • 手動更新(cron不要)
  • 完全自動更新(cron必要)
  • 動画重複チェック
  • 1度の処理で50件以上の動画を収集&投稿可能
  • 使用するwpテーマは何でもOK
  • 動画の取得順指定
  • 収集対象動画の期間指定
  • キーワード検索
  • チャンネル指定
  • カテゴリ指定
  • 取得件数指定
  • 予約投稿
  • 本文テンプレ挿入
  • 動画説明挿入

プログラムの自作が難しい方はこのプラグインを使用してする事で、簡単に動画まとめサイトのオーナーになれますよ。良かったら試してみて下さい。

コメント