web-dev-qa-db-ja.com

毎日の写真ブログを自動化する

誰かが私が以下を合理化できる最善の方法についていくつかの提案をしてくれるかどうか疑問に思いました。

私は毎日アップロードしているWordPressブログ(私的にホストされている)を持っています(よく、通常は一度に大量のアップデートをスケジュールします)。アップロードしてタグを付け、非常に簡単なコメントを書きます。

私はもともと私が画像をFTP転送できるサーバー上のフォルダーを検討していたので、毎日そこに見えるようなものを書いてその写真に基づいて投稿を作成するつもりでした。それ。

任意の助けは大歓迎です。

P.S私はこれをコミュニティウィキにするつもりですが(正解は言うまでもなく1つの答えさえあるとは思いませんので)、私はまだ十分な権限を持っていません!

3
Toby

毎日の写真ブログを達成する方法はたくさんありますがありますので、どのようにアプローチするかをお伝えします。

WordPressでフォトブログを設定したい場合は、 Flickr アカウントで開始し、それを活用します何らかの理由でFlickrが好きではありません PhotoBucketSmugMugPicasa または oneその他 Flickr 代替 。)

Flickrを使用する

Flickrでは arebulkploading - tools多数の写真を管理するための多くのツール を含む多くの写真を簡単にアップロードできるようにします。

Flickr自体には 写真ブログをサポートする組み込みツールemail-to-blog が含まれています。

また、既存のツールではFlickrで十分な制御ができない場合は、統合および自動化するPHPスクリプトをいつでも記述できます。方法を示す多くのブログ投稿があります(また、以下にその作成方法も示します):

そして、少なくともいくつかのPHPライブラリは、Flickr APIへのアクセスを簡素化します。

Flickr APIを探索する

それでは、Flickrにアップロードされたファイルを使用してWordPressに簡単な写真ブログを作成したいとしましょう。最初のステップはAPIキーを取得するです。

あなたがそれにいる間、あなたはAPIドキュメントをスキャンしたいかもしれません:

現在、APIを介してFlickrにクエリを実行するさまざまな方法があります。 写真セットのクエリ で説明しますが、 タグで検索 を検討することもできます。

最初の例では、というタイトルのFlickr写真セットを使用します。 " Barber Motorcycle Museum-2006年10月21〜22日 "(人々が気に入っているようだから使用しています。多くのトラフィックを取得します。)URLで見つけることができるphotoset_idを取得する必要があります。

Where to find 'photoset_id' on a Flickr Photo Setlink text
(ソース: mikeschinkel.com

次に、次の形式のURLを使用してFlickr APIのflickr.photosets.getPhotosメソッドを呼び出す必要があります。

http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key={YOUR_API_KEY_GOES_HERE}&photoset_id=72157594340403773&media=photos&format=json&nojsoncallback=1

注意{YOUR_API_KEY_GOES_HERE}を独自のAPIキーに置き換えると、実際にブラウザから呼び出すことができ、次のようになります。

Calling the Flickr API directly from your Browser
(ソース: mikeschinkel.com

また、 JSON を要求することに注意してください。format=json&nojsoncallback=1 URLパラメーターを使用して戻ります。XMLよりもJSONを処理する方がはるかに簡単で、nojsoncallbackname__は必要に応じてコールバックを省略しますJavascriptでの作業。

返されるのは写真のリストを含むネストされたデータ構造であり、写真ごとに次の属性を持つオブジェクトを取得します(以下に示すもの)標準のPHPprint_r() function):によって生成された写真の配列の最初の要素の出力

[0] => stdClass Object
  (
    [id] => 276672853
    [secret] => 099eaa1af2
    [server] => 107
    [farm] => 1
    [title] => Barber Motorcycle Museum - Oct 22 2006 (500)
    [isprimary] => 0
  )

Flickrの写真URL形式

これで、次に必要な最近の写真のリストができましたFlickrの写真のURL形式を理解するをご覧ください。

一般に、Flickrの写真のURLは次のようになります。

500pxワイドまたはハイ「標準」写真:

  • http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg

このバージョンは、最長辺が500ピクセルになります。

元の画像:

  • http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{o-secret}_o.(jpg|gif|png)

これは、アップロードされたものであれば何でもかまいません。JPG、.GIF、または.PNG。

特定のサイズのバージョン:

これらは常に.JPGです。

  • http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}_[size].jpg

[size]は次のいずれかです。

  • s-小さな正方形75x75
  • t-サムネイル、最長辺100
  • m-小さい、最長辺が240
  • z-中、最長辺が640
  • b-大きい、最長側で1024(非常に大きな元の画像にのみ存在)

したがって、上記の結果の例から取られた次のURLは、後続の写真を取得します.jpgの前のzname__が最長サイズで幅640ピクセルの写真を示していることに注意してください:)

Photo of Motorcycle on Flickr

上記のすべての情報を用意して、WordPressのWP_Httpクラスを使用してセットから写真を取得するPHPスクリプトを作成できるようになりました。私はあなたのウェブサイトのルートにコピーできるシンプルなスクリプトを書きました。それを実行する前に必ずあなた自身のapi_keyphotoset_idに置き換えてください:

include "wp-load.php";
define('FLICKR_API_KEY','{YOUR_API_KEY_GOES_HERE}');
define('FLICKR_GET_URL','http://api.flickr.com/services/rest/');
define('PHOTO_SIZE_CHAR', 's'); // s = 75x75 pixels on longest side
$result = flickr_get(array(
  'method'      => 'flickr.photosets.getPhotos',
  'photoset_id' => '{YOUR_PHOTOSET_ID_GOES_HERE}',
  'media'       => 'photos'
));
if (isset($result['body']->photoset->photo)) {
  $size = PHOTO_SIZE_CHAR;
  foreach($result['body']->photoset->photo as $photo) {
    extract((array)$photo);
    $url = "http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}_{$size}.jpg";
    echo "<img src=\"{$url}\" alt=\"{$title}\" />\n";
  }
}
function flickr_get($params,$args=array()) {
  $http = new WP_Http();
  $params['api_key'] = FLICKR_API_KEY;
  $params['format'] = 'json';
  $params['nojsoncallback'] = 1;
  $params = http_build_query($params);
  $url = FLICKR_GET_URL . "?{$params}";
  $result = $http->get($url,$args);
  if (isset($result['response']['code']) && $result['response']['code'] == 200)
    $result['body'] = json_decode($result['body']);
  else
    $result = false;
  return $result;
}

APIキーとPhotoset IDで上記を使用すると、次の結果が得られます。

Output of a PHP Script Showing a Flickr Photoset
(ソース: mikeschinkel.com

Flickr Photoset写真をブログに投稿するためのPHPスクリプト

blog-from-flickr.phpというページを作成したすべてのことに基づいて、Webサイトのルートに配置し、次の簡単なフォームを取得するために呼び出すことができます。

Blog From Flickr PHP Script for WordPress
(ソース: mikeschinkel.com

有効なPhotoset IDを入力し、そのボタンをクリックすると、次のようなブログ投稿にリダイレクトされます!

Blog Post Generated from a Flickr Photoset Photo via a PHP Script
(ソース: mikeschinkel.com

すべてを機能させるには、上記の簡単なコードよりも少し複雑で、完全に文書化する時間はありませんが、レビューのために以下に投稿します(また、 ダウンロードすることもできますここから )。

特筆すべきは、コードの次の側面です。

  • スクリプト最新の25枚の写真をプル写真セットから、それらの最も古いものの1つをブログします。一括でアップロードしてから、時間順に投稿したいと思いました。 25を超える数をアップロードする場合、定数FLICKR_PHOTO_COUNTの値を最大500(500はFlickrで指定された制限です。)に大きくする必要がありますスクリプトの実行にかかる時間。目立たないかもしれません。

  • スクリプトwp_postmetaにFlickrの写真IDを隠しカスタムフィールドとして保存キー'_flickr_photo_id'を使用します。それは私がそれが前にブログされたかどうかを見分ける方法です。

  • スクリプトHTTP POSTname__メソッドを使用する(つまり、HTML <form>を使用する場合HTTP GETname__メソッド(呼び出しURLを直接)から誤って投稿プロセスをトリガーしないおよび別の写真セットからの投稿を許可.

  • このスクリプトは、current_user_can('publish_posts')を使用して、ログインしているユーザーのみを確保するを使用して、投稿権限を設定すると、投稿ロジックをトリガーできます。

  • スクリプトは写真のdescriptionをFlickrから取得して使用します投稿コンテンツの<img>タグのプレフィックスとして(私の例のスクリーンショットには説明がないため、写真のみが表示されます)

  • スクリプトRLでPHPのgetimagesize()を呼び出すは、<img>タグの高さと幅を取得します。サーバーがそのように構成されていない場合、画像にサイズと幅のタグが表示されません(実際にコードがクラッシュする可能性があります;私はテストできません。クラッシュする場合は、わかります。 :)

  • Flickrからタグを持ち込んでタグとして追加する努力はしませんでしたが、それは他の誰かにとって価値のある練習になるでしょう。

そしてそれはそれについてです。コードについて...

Flickr写真ブログコード:

<?php
/*

  blog-from-flickr.php

  Allows the WordPress blog owner to blog a recent photo from a Flickr Photoset just by clicking a button.

  Author: Mike Schinkel (http://mikeschinkel.com)

  Just drop this example into the root of your website and call directly to see it work.
  Use the class in your plugins or themes.

  In Answer To: http://wordpress.stackexchange.com/questions/2830/

*/

include "wp-load.php";
define('FLICKR_API_KEY','{YOUR_FLICKR_API_KEY_GOES_HERE}');
define('DEFAULT_PHOTOSET_ID','{YOUR DEFAULT_PHOTOSET_GOES_HERE');
define('FLICKR_PHOTO_COUNT',25);

define('FLICKR_GET_URL','http://api.flickr.com/services/rest/');

$photoset_id = DEFAULT_PHOTOSET_ID;

if (count($_POST)==0)
  echo <<<HTML
<html>
<body>
  <form method="post">
    Enter Flickr Photoset ID: <input type="text" name="photoset_id" value="{$photoset_id}" size="25" />
    &nbsp;<input type="submit" value="Blog Recent Photo from Flickr!" />
    <input type="hidden" name="go" value="go!" />
  </form>
</body>
</html>
HTML;
else
  BlogFlickrPhotoSetPhoto::blog_photoset_photo($_POST['photoset_id']);

class BlogFlickrPhotoSetPhoto {
  static function blog_photoset_photo($photoset_id) {
    if (current_user_can('publish_posts')) {
      $photoset = self::get_photoset_photos($photoset_id);
      if (!$photoset) {
        echo 'Not a valid Photoset ID. <a href="#">Try again</a>.';
      } else {
        $photo = self::get_photo_to_blog($photoset);
        if (!$photo) {
          echo 'Unexpected Error. Photo Retrieval Failed.';
        } else {
          $permalink = self::blog_photo($photo);
          wp_safe_redirect($permalink);
        }
      }
    }
  }
  static function blog_photo($photo) {
    $img = self::get_photo_html($photo);
    $photo_info = self::get_photo_info($photo->id);
    $description = ($photo_info ? "{$photo_info['body']->photo->description->_content}<br/>" : '');
    $url = self::get_photo_url($photo);
    $post_id = wp_insert_post(array(
      'post_title' => $photo->title,
      'post_type' => 'post',
      'post_author' => 1,
      'post_content' => "{$description}{$img}",
      'post_status' => 'publish',
      'comment_status' => 'open',
      'ping_status' => 'open',
      'post_parent' => 0,
    ));
    if ($post_id) {
      update_post_meta($post_id,'_flickr_photo_id',$photo->id);
      $url = get_permalink($post_id);
    } else {
    $url = false;
    }
    return $url;
  }
  static function get_photo_to_blog($photoset) {
    global $wpdb;
    $photo = false;
    if (isset($photoset['body']->photoset->photo)) {

      //Collect the list of Flickr Photo_ids from our "N" most resent photoset photos
      $photos = $photoset['body']->photoset->photo;
      foreach($photos as $index => $photo) {
        $photo_ids[$index] = $photo->id;
      }
      $photo_id_list = "'" . implode("','",$photo_ids) . "'";

      //Get a list of all photos we've already blogged
      $posts = $wpdb->get_results("SELECT post_id,meta_value FROM wp_postmeta WHERE meta_key='_flickr_photo_id' && meta_value IN ({$photo_id_list})");

      //Remove any photos from the list we've already blogged
      $photo_ids = array_flip($photo_ids);
      foreach($posts as $post) {
        if (isset($photo_ids[$post->meta_value])) {
          unset($photo_ids[$post->meta_value]);
        }
      }

      //Grab the earliest photo we've not blogged
      if (count($photo_ids)==0) {
        $photo = false;
      } else {
        krsort($photo_ids);
        $photo = $photos[reset($photo_ids)];
      }
    }
    return $photo;
  }
  static function get_photoset_photos($photoset_id) {
    $photoset = self::flickr_get(array(
      'method'      => 'flickr.photosets.getPhotos',
      'photoset_id' => $photoset_id,
      'media'       => 'photos',
      'per_page'    => FLICKR_PHOTO_COUNT,
    ));
    return $photoset;
  }
  static function get_photo_info($photo_id) {
    $photo_info = self::flickr_get(array(
      'method'   => 'flickr.photos.getInfo',
      'photo_id' => $photo_id,
    ));
    return $photo_info;
  }
  static function get_photo_html($photo,$size='') {
    $url = self::get_photo_url($photo,$size);
    list($width, $height) = getimagesize($url);
    $hwstring = image_hwstring($width, $height);
    return "<img src=\"{$url}\" alt=\"{$title}\" {$hwstring} />\n";
  }
  static function get_photo_url($photo,$size='') {
    extract((array)$photo);
    $size = (!empty($size) ? "_{$size}" : ''); // If empty the 500px version will be returned.
    return "http://farm{$farm}.static.flickr.com/{$server}/{$id}_{$secret}{$size}.jpg";
  }
  static function flickr_get($params,$args=array()) {
    $http = new WP_Http();
    $params['api_key'] = FLICKR_API_KEY;
    $params['format'] = 'json';
    $params['nojsoncallback'] = 1;
    $params = http_build_query($params);
    $url = FLICKR_GET_URL . "?{$params}";
    $result = $http->get($url,$args);
    if (isset($result['response']['code']) && $result['response']['code'] == 200)
      $result['body'] = json_decode($result['body']);
    else
      $result = false;
    return $result;
  }
}

全自動Flickr写真ブログ

さらに先へ進む必要がある場合は、HTTP POSTname__でトリガーする代わりに、上記を再コーディングして擬似cronを使用できます。これに役立ついくつかの記事へのリンクを次に示します。

また、擬似cronで十分でない場合は、常にスクリプトの名前を不明瞭な名前に変更し、実際のcronを使用して不明瞭な名前のURLを取得できます。そのルートに行く必要がある場合は、 Googleでcronタスクの設定方法を確認してください。

どちらの場合もcronを使用すると、ログインしないため、おそらくcurrent_user_can()コードを削除する必要があります。

追伸Flickr NSIDの取得(ユーザーID)

上記以外にも、いくつかのメソッドでFlickr NSIDを取得(別名ユーザーID)が必要な場合があります。

P.P.S. FlickrでPHPスクリプトを認証するのは難しい

使用した例では、呼び出し元を認証する必要がないことに注意してください。認証にはもう少し関与するので、必要な場合は、FlickrPHPのライブラリを調べてください。

11
MikeSchinkel

私は実際には代わりに電子メールによる組み込み投稿を使用することをお勧めします。あなたはプライベートEメールアドレス([email protected])を設定し、そのアドレスに画像とあなたの説明の両方を送ります。 WordPressはあなたのEメールから新しい投稿を作成し、自動的に画像を添付します。

これはFTPよりも少し簡単です。

3
EAMann