wp-cronでワードプレス記事の自動投稿機能を実装する

FANZA

自動アダルト動画まとめサイトを自作しちゃおうシリーズもそろそろ大詰めです、前回の記事までで必要な機能の大半は実装を終えましたがこれらを実行するためのトリガーをテスト用から本番用に書き換える必要があります。

スクリプトの目的によってトリガーは変わると思いますが、今回は自動投稿なので〇時間/1回という時間の経過によって処理を実行させる方法でトリガーを作っていきます。

定期実行にはcronを使う

cronというはユーザーの代わりに動作させたい機能を自動で実行してくれる便利機能で、設定されたスケジュールに従って止めるまで処理を実行し続けてくれます。処理の自動化には絶対欠かせないあなたの代わりに仕事をしてくれるすごいやつです。

wordpressでの定期実行の場合、サーバー側で用意されているcronかWP関数で用意されているWP-cronかのどちらかを使う事になりますが、今回はcron機能が用意されていないサーバーでも利用できるWP関数のWP-cronを使って定期実行を実装していきます。

WP関数のWP-cron

疑似的にcronを再現したwordpressの独自関数で正確にはcronではありません、時間をトリガーにするcronに対してWP-cronは時間&アクセスをトリガーにして実行されます。つまり実行予定の時間になってもブログにアクセスが無い場合wp-cronは実行されません

アクセスさえあればcron機能の付いていない格安サーバーでも定期実行を行えるので、使用しているサーバーを問わないというメリットもあります。一方でアクセス毎に処理を実行するか判定が入るため、アクセスが多くなればなるほど微妙に重くなっていくというデメリットもありますが、これに悩まされる頃にはアクセスも広告収益も十分に上がっている状態だと思うので、最初から考える必要はあまりないかなと考えています。

ブログへのアクセスは一般ユーザー以外に自分でアクセスしてもwp-cronは作動するので、立ち上げ当初で誰も見ていないサイトでも最悪自分でブログを開けばwp-cronに登録したスクリプトを実行する事はできます。

WP-cronで記事の自動投稿を実行させるスクリプト

では今まで作って来たwordoressの自動投稿の仕組みをwp-cronで定期実行をさせてみます、コード自体は短いので実装は簡単です。

wp-cronでwordpressの記事を自動生成
function fanza_get_video(){
  
  require_once(ABSPATH. "wp-admin/includes/upgrade.php");
  global $wpdb;
  
  $table_name = $wpdb->prefix. "fanza_video";
  $fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );
  var_dump($fanza_video_count);
  
  $fanza_video_total_count = 11285;
  $fanza_hits = 1;
  $fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
  if( $fanza_offset <= 0 ){
    $fanza_offset = 1;
  };
  
  $search_option=array(
    'api_id' => 'APIID',
    'affiliate_id' => 'アフィリエイトID',
    'site' => 'FANZA',
    'service' => 'digital',
    'floor' => 'videoa',
    'hits' => $fanza_hits,
    'offset' => $fanza_offset,
    'sort' => 'date',
    'article' => 'genre',
    'article_id' => 1034,
  );
  $request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
  $res_data=json_decode(@file_get_contents($request_url), true);
  
  //var_dump($res_data["result"]["result_count"]);
  
  for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
    
    //print($res_data["result"]["items"][$n]["content_id"]).'<br>';
    //print($res_data["result"]["items"][$n]["title"]).'<br>';
    //print($res_data["result"]["items"][$n]["volume"]).'<br>';
    //print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
    //print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
    //print($res_data["result"]["items"][$n]["URL"]).'<br>';
    //print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
    //print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
    //print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
    //print($res_data["result"]["items"][$n]["date"]).'<br>';
    //var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
    //var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
    
    $insert_count = $wpdb->query( $wpdb->prepare(
      "INSERT IGNORE INTO $table_name(
        fanza_video_content_id,
        fanza_video_title
      ) VALUE(%s, %s)",
        $res_data["result"]["items"][$n]["content_id"],
        $res_data["result"]["items"][$n]["title"]
    ));
    
  if( $insert_count <= 0 ){
    return;
  }
    
  if( empty($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']) ){
    $fanza_sample_video = '';
  } else {
    $fanza_sample_video = '<div style="width:100%; padding-top: 75%; position:relative;"><iframe width="100%" height="100%" max-width="1280px" style="position: absolute; top: 0; left: 0;" src="'.$res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480'].'" scrolling="no" frameborder="0" allowfullscreen></iframe></div>';
  }
  $fanza_tags_array = array();
  foreach( $res_data["result"]["items"][$n]["iteminfo"]["genre"] as $genre ){
    array_push( $fanza_tags_array, $genre["name"] );
  }
  foreach( $res_data["result"]["items"][$n]["iteminfo"]["actress"] as $actress ){
    array_push( $fanza_tags_array, $actress["name"] );
  }
    var_dump($fanza_tags_array);
    
  $fanza_post_meta = array(
    'post_title' => $res_data["result"]["items"][$n]["title"],
    'post_content' => 
      '<p>'.$res_data["result"]["items"][$n]["title"].'</p>'.
      '<p>'.$res_data["result"]["items"][$n]["volume"].'</p>'.
      '<p>'.$res_data["result"]["items"][$n]["review"]["count"].'</p>'.
      '<p>'.$res_data["result"]["items"][$n]["review"]["average"].'</p>'.
      '<p>'.$res_data["result"]["items"][$n]["URL"].'</p>'.
      '<p>'.$res_data["result"]["items"][$n]["affiliateURL"].'</p>'.
      '<img src="'.$res_data["result"]["items"][$n]["imageURL"]["large"].'"></img>'.
    $fanza_sample_video,
    'post_status' => 'publish',
    'post_author' => 1,
    'post_category' => array( 57 ),
    'tags_input' => $fanza_tags_array,
  );
    
  remove_filter('content_save_pre', 'wp_filter_post_kses');
  remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
 
  $fanza_post_id = wp_insert_post($fanza_post_meta);

  add_filter('content_save_pre', 'wp_filter_post_kses');
  add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
    
  $fanza_thumb_url = $res_data["result"]["items"][$n]["imageURL"]["large"];
  $f = array();
  $f['name'] = $fanza_post_id.'-'.$res_data["result"]["items"][$n]["content_id"].'.jpg';
  $f['tmp_name'] = download_url($fanza_thumb_url);
  $fanza_thumb_id = media_handle_sideload($f, $fanza_post_id);
  wp_get_attachment_url( $fanza_thumb_id );
  set_post_thumbnail( $fanza_post_id, $fanza_thumb_id );
    
  }
  
   return($res_data);
}
add_action('fanza_get_video', 'fanza_get_video');

if( !wp_next_scheduled( 'fanza_get_video' ) ){
	wp_schedule_event( time(), 'hourly', 'fanza_get_video' );
}

前回の記事までで作成した独自関数「fanza_get_video」をwp_schedule_eventでcronの定期実行イベントへ追加しています。ただし、同じトリガーを何度も作成しないためwp_next_scheduledで同名のイベントが登録されていないかチェックしています。

デフォルトのwordpressだとcronイベントに登録されたトリガーが確認できないため、「WP Crontrol」というプラグインをインストールして動作中のcronイベントを確認。すると「fanza_get_video」がちゃんと登録されているのを確認できます。

wp_schedule_eventでは1時間毎の実行が最短ですが、もっと高頻度で処理を実行させたい場合はオリジナルの実行頻度を追加する事も簡単にできます。今回は1時間毎で十分なので含めていませんが公式のcron_schedulesページでサンプルスクリプトを確認できます。

スクリプトを綺麗に掃除する

ここまででFANZA動画データを用いた自動まとめアダルトサイトはほとんど完成しましたが、今まで書いてきたスクリプトが結構ごちゃごちゃして来ました。必要ない部分を消したり各ブロック毎に機能をメモって忘れないようにしておきます。マジで忘れるんでめっちゃメモ大事です。

function fanza_get_video(){

  //wrodpressファイルの読み込み
  require_once(ABSPATH. "wp-admin/includes/upgrade.php");
  global $wpdb;

  //FANZA動画用テーブル情報
  $table_name = $wpdb->prefix. "fanza_video";
  $fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );

  //商品検索APIを続きから取得するfooset値の計算
  $fanza_video_total_count = 11285;
  $fanza_hits = 1;
  $fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
  if( $fanza_offset <= 0 ){
    $fanza_offset = 1;
  };

  //商品情報検索APIのリクエストURL作成
  $search_option=array(
    'api_id' => 'APIID',
    'affiliate_id' => 'アフィリエイトID',
    'site' => 'FANZA',
    'service' => 'digital',
    'floor' => 'videoa',
    'hits' => $fanza_hits,
    'offset' => $fanza_offset,
    'sort' => 'date',
    'article' => 'genre',
    'article_id' => 1034,
  );
  $request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
  $res_data=json_decode(@file_get_contents($request_url), true);
  
  //検索結果の件数分繰り返し処理
  for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
    
    //FANZA動画情報の重複管理テーブル「wp_fanza_video」へ追加
    $insert_count = $wpdb->query( $wpdb->prepare(
      "INSERT IGNORE INTO $table_name(
        fanza_video_content_id,
        fanza_video_title
      ) VALUE(%s, %s)",
        $res_data["result"]["items"][$n]["content_id"],
        $res_data["result"]["items"][$n]["title"]
    ));
    
    //レコードが重複していた場合return
    if( $insert_count <= 0 ){
      return;
    }
    
    //FANZA動画データにサンプル動画があるか判定
    if( empty($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']) ){
      $fanza_sample_video = '';
    } else {
      $fanza_sample_video = '<div style="width:100%; padding-top: 75%; position:relative;"><iframe width="100%" height="100%" max-width="1280px" style="position: absolute; top: 0; left: 0;" src="'.$res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480'].'" scrolling="no" frameborder="0" allowfullscreen></iframe></div>';
    }
	  
    //FANZA動画データのカテゴリとジャンルから記事に付与するタグを生成
    $fanza_tags_array = array();
      if( !empty($res_data["result"]["items"][$n]["iteminfo"]["genre"]) ){
        foreach( $res_data["result"]["items"][$n]["iteminfo"]["genre"] as $genre ){
          array_push( $fanza_tags_array, $genre["name"] );
        }
      }
      if( !empty($res_data["result"]["items"][$n]["iteminfo"]["actress"]) ){
        foreach( $res_data["result"]["items"][$n]["iteminfo"]["actress"] as $actress ){
          array_push( $fanza_tags_array, $actress["name"] );
        }
      }
    
    //記事の作成
    $fanza_post_meta = array(
      'post_title' => $res_data["result"]["items"][$n]["title"],
      'post_content' => 
        '<p>'.$res_data["result"]["items"][$n]["title"].'</p>'.
        '<p>'.$res_data["result"]["items"][$n]["volume"].'</p>'.
        '<p>'.$res_data["result"]["items"][$n]["review"]["count"].'</p>'.
        '<p>'.$res_data["result"]["items"][$n]["review"]["average"].'</p>'.
        '<p>'.$res_data["result"]["items"][$n]["URL"].'</p>'.
        '<p>'.$res_data["result"]["items"][$n]["affiliateURL"].'</p>'.
        '<img src="'.$res_data["result"]["items"][$n]["imageURL"]["large"].'"></img>'.
      $fanza_sample_video,
      'post_status' => 'publish',
      'post_author' => 1,
      'post_category' => array( 57 ),
      'tags_input' => $fanza_tags_array,
    );
    
    remove_filter('content_save_pre', 'wp_filter_post_kses');
    remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
 
    $fanza_post_id = wp_insert_post($fanza_post_meta);

    add_filter('content_save_pre', 'wp_filter_post_kses');
    add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
    
    //作成した記事にサムネイルをセット
    $fanza_thumb_url = $res_data["result"]["items"][$n]["imageURL"]["large"];
    $f = array();
    $f['name'] = $fanza_post_id.'-'.$res_data["result"]["items"][$n]["content_id"].'.jpg';
    $f['tmp_name'] = download_url($fanza_thumb_url);
    $fanza_thumb_id = media_handle_sideload($f, $fanza_post_id);
    wp_get_attachment_url( $fanza_thumb_id );
    set_post_thumbnail( $fanza_post_id, $fanza_thumb_id );
    
    }

}
add_action('fanza_get_video', 'fanza_get_video');

//wp-cronスケジュールの作成
if( !wp_next_scheduled( 'fanza_get_video' ) ){
	wp_schedule_event( time(), 'hourly', 'fanza_get_video' );
}

色々整理して最終的には上記の感じになりました、APIIDとアフィリエイトIDを自分の物に書き換えてfunction.phpにコピペすればとりあえず動くと思います。

まとめ

お疲れ様でした!ついに自動アダルト動画サイトが完成しましたね~、結構いい感じじゃないですか?

実際にサイトを運営するにはデザイン・集客・ABテストなどやる事はまだあると思いますが、延々とコンテンツを手作業で更新する地獄からは解放された状態からスタートできますんで、お小遣い稼ぎの手助けをしてくれる事は間違いないでしょう。

次回はtwitterと連携して投稿した記事を自動でツイートする機能も追加してみます(‘ω’)ノ

DMMの商品データを一括取得するアプリ「DeepKiss」

DMMの商品をツイッターに投稿したりアフィリエイトサイトを作りたかったんですが、DMMAPIでは100件刻みでしかデータ取得が出来なかったのでMAX50,000件まで1発で取得できるデスクトップアプリを作りました。

使っている様子はこんな感じ。

DMMの商品データが大量にあればブログのランキング記事も簡単に作れるようになりますし、商品データベースとして用いればアフィリエイトサイトの構築も難しくないです。取得できる項目には在庫情報も含まれているので、限定品やレア物をピックアップすればそのまませどり用のリストにも使えます。

データ取得はアプリにお任せ、商品紹介でゴリゴリ稼ぎたい方はぜひお試し下さいm(_ _)m

今すぐダウンロードする

個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ

質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。

コメント