勉強したことのメモ

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のパーマリンクについて

WordPressのパーマリンクについて、思ったことなんだけど、 ・URLに日本 ...

WordPressでプラグインの作成方法

WordPressで簡単なニュースを表示させるというプラグインを作成したので、使 ...

WordPressで複数のカテゴリーを取得する方法(get_the_category_list)

WordPressで1つの記事に対して複数カテゴリを設定していた場合、テーマによ ...

WordPressにてパーマリンク設定のカテゴリーベースに関して

WordPressのパーマリンク設定でカテゴリベースを設定したかった。ここは変更 ...

WordPressで任意のクエリをページ内で出力する方法

WordPressの固定ページ内でuidという任意のGETクエリを取得して、記事 ...