勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

youtubeの検索結果をWordPressに自動投稿する方法

   2024/03/04  WordPress

youtubeから特定のキーワードで検索した動画をWordPressに自動で投稿したいという案件があった。半自動ならプラグインは見つけられたけど、完全自動のものは見つけられなかったので、XML-RPを用いて関数を作成した。以下に使い方のメモ。

 

ダウンロード先

http://scripts.incutio.com/xmlrpc/

 

関数

//----------------------------------------
//    WordPress外部投稿
//
//    **引数**
//    $dir(string)        このプログラムとIXR_Library.phpを置いてあるディレクトリを絶対パスで指定
//    $domain(string)    投稿したいWordPressを置いているサーバのドメイン
//    $user(string)        WordPressのユーザー
//    $pass(string        WordPressのパスワード
//    $author(int)        投稿者のID
//    $status(string)    投稿状態。デフォルトは下書き。publishだと公開
//    $category(int)    投稿カテゴリ。デフォルトは未分類
//    $searchWord(string)    youtubeの検索ワード
//    $filter(string)    youtubeのフィルタをクエリで指定。空だと関連性の高い順
//    $tag(array) 投稿タグ。デフォは何もなし
//
//    **返り値**
//    bool(true or false)
//----------------------------------------
function postYoutubeWordPress( $dir, $domain, $user, $pass, $author = 1, $status = 'draft', $category = 1, $searchWord, $filter, $tag )
{
    //必須引数のチェック
    if( !$dir || !$domain || !$user || !$pass || !$searchWord ){
        return false;
    }

    //ライブラリの読み込み
    include_once($dir . 'IXR_Library.php');
    $client = new IXR_Client($domain . 'xmlrpc.php');

    //SQLite開く。テーブル無ければ作る
    $dbFile = $dir . 'youtube.sqlite';
    $dbFlg = ( file_exists($dbFile) ) ? true : false;
    $sqlite = new SQLite3($dbFile);
    if( !$dbFlg ){
        $query = "
            CREATE TABLE 'youtube' 
            (
                'seq' INTEGER PRIMARY KEY, 
                'title' TEXT, 
                'movie' INT
            );
        ";
        $result = $sqlite->query($query);
    }

    //youtubeからデータ取得
    $youtube = 'https://www.youtube.com/results?search_query=' . urlencode($searchWord) . $filter;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $youtube);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $line = curl_exec($curl);
    $line = mb_convert_encoding($line,'UTF-8','auto');

    //取得したデータから正規表現で動画IDとtitleを取得
    $pattern="/<a href=\"\/watch\?v=(.*?)\"[\n|\s]class=\".*?\"[\n|\s]data-sessionlink=\".*?\"[\n|\s]title=\"(.*?)\"[\n|\s]/";
    $match = array();
    preg_match_all($pattern, $line, $match, PREG_SET_ORDER);

    //ループ処理
    for ($i = 0; $i< count($match); $i++) {

        $movieId = $match[$i][1];
        $movieTitle = $match[$i][2];

        //既に登録されていないかチェック
        $query = '
            SELECT * 
            FROM youtube 
            WHERE movie = "'. $movieId .'" 
            LIMIT 1
        ';
        $result = $sqlite->query($query);
        $flg = false;
        while ($rs = $result->fetchArray()) {
            if( $rs['seq'] ) $flg = true;
        }

        if( $flg ) continue; 

        //登録されていない場合はDBに登録
        $query = '
            INSERT INTO youtube 
                (title, movie) 
            VALUES 
                ("'. $movieTitle .'", "'. $movieId . '")
        ';
        $result = $sqlite->query($query);

        $iframeUrl = '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $movieId . '" frameborder="0" allowfullscreen></iframe>';

        $postData = array(
            'post_author' => $author,
            'post_status' => $status,
            'post_title' => $movieTitle,
            'terms' => array('category' => array($category)),
            'post_content' => $iframeUrl,
            'terms_names' => array('post_tag' => $tag)
        );

        $return = ( $result = $client->query('wp.newPost', 1, $user, $pass, $postData) ) ? true : false;
        if( !$return ){
            return $return;
        }
    }

    return $return;
}

 

使い方

cronで回すことを想定したのでディレクトリは絶対パスで指定する。あとフィルタのクエリに関しては「&filters=week&lclk=week」みたいな形で指定。

WordPressのプラグインでVideo Thumbnailsをインストールして有効化しておくとアイキャッチ画像を自動で設定してくれるので、これもインストールしておく。

あとはcronで回す。

 - WordPress

  関連記事

WordPressで閲覧者にテーマを変更させるプラグイン(Theme Switcher)

「新規サイトを○○みたいなイメージでWordPressのテーマを見繕って欲しい」 ...

WordPressにインスタグラムの画像を表示させる方法

WordPressにインスタグラムへ投稿している画像を表示させたかった。プラグイ ...

WordPressで連載(シリーズ)記事機能を「Series」プラグインで実装する方法

WordPressで連載(シリーズ)記事機能を実装したい。例えば「PHPでBBS ...

Advanced Custom Fieldsでチェックボックスの記事を取得

Advanced Custom Fieldsでチェックボックス設定しているカスタ ...

WordPressでオリジナルのプラグインを作成する方法

WordPressでオリジナルのプラグインを作成する方法を以下にメモ。 &nbs ...