Pregunta

Me preguntaba si alguien podría darme algunas sugerencias sobre la mejor manera de simplificar lo siguiente;

Tengo un blog de WordPress (alojado de forma privada) que actualizo diariamente (bueno, normalmente programo un montón de actualizaciones a la vez) con imágenes que subo, etiquete y sobre las que escribo un comentario muy breve.

Originalmente estaba considerando una carpeta en el servidor en la que pudiera enviar imágenes por FTP y luego escribiría algo que se vería allí diariamente y crearía una publicación basada en la imagen, pero luego no estaba seguro de los metadatos que quiero junto con él.

Cualquier ayuda sería muy apreciada.

PD: Haría de este un wiki comunitario (ya que no estoy seguro de que haya ni siquiera una respuesta y mucho menos una respuesta correcta destacada), ¡pero todavía no tengo suficientes privilegios adecuados!

¿Fue útil?

Solución

Hay Muchas maneras de realizar un blog de imágenes diario. así que te daré cómo lo abordaría.

Si quisiera crear un fotoblog en WordPress, comenzaría con un Flickr cuenta y aprovecharla (o si no te gusta Flickr por alguna razón también puedes mirar cubo de fotos, Taza engreída, Picasa o uno del otro Flickr alternativas.)

Usando Flickr

Con Flickr ahí son a granel subiendo herramientas para que le resulte más fácil cargar muchas fotos, incluidas muchas herramientas para gestionar una gran cantidad de fotos.

El propio Flickr tiene herramientas integradas para soportar blogs de fotos incluido correo electrónico a blog.

Y si las herramientas existentes no te dan suficiente control con Flickr siempre puedes escribir algunos scripts PHP para integrar y automatizar.Hay muchas publicaciones de blog que le muestran cómo (y también te mostraré cómo escribir uno, a continuación):

Y al menos algunas bibliotecas PHP para simplificar el acceso a la API de Flickr:

Explorando la API de Flickr

Entonces, digamos que quieres hacer un pequeño blog de fotos simple en WordPress usando archivos que se han subido a Flickr.El primer paso es obtener una clave API:

Mientras lo hace, es posible que desee simplemente escanear los documentos de la API:

Ahora hay muchas formas diferentes de consultar Flickr a través de su API.Te mostraré cómo Consultar un conjunto de fotografías pero también podrías considerar Búsqueda por etiquetas.

Para el primer ejemplo usaré mi conjunto de fotografías de Flickr titulado "Museo de la motocicleta Barber - 21 y 22 de octubre de 2006" (Lo estoy usando porque parece que a la gente le gusta;recibe mucho tráfico.) Necesitarás conseguir el photoset_id que puedes encontrar en la URL:

Where to find 'photoset_id' on a Flickr Photo Setlink text
(fuente: mikeschinkel.com)

A continuación debe llamar al flickr.photosets.getPhotos método de la API de Flickr con una URL del siguiente formato:

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

Nota que una vez que reemplaces {YOUR_API_KEY_GOES_HERE} Con su propia clave API, puede llamarla desde su navegador y se verá así:

Calling the Flickr API directly from your Browser
(fuente: mikeschinkel.com)

También tenga en cuenta que solicito JSON volver usando el format=json&nojsoncallback=1 Parámetros de URL porque me resulta mucho más fácil manejar JSON que XML, y el nojsoncallback omite la devolución de llamada que sería necesaria si se trabaja en Javascript.

Lo que recuperarás es una estructura de datos anidada que contiene una lista de fotos, y por cada foto obtendrás un objeto con los siguientes atributos (Lo que muestro debajo es la salida del primer elemento de la serie de fotos generada por el PHP estándar print_r() función):

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

Formatos de URL de fotografías de Flickr

Ahora que tenemos nuestra lista de fotos recientes, lo siguiente que debes hacer es entender el formato URL de fotos de Flickr sobre el cual puedes leer más aquí:

En general, las URL de fotos de Flickr son así:

Foto "estándar" de 500 píxeles de ancho o alto:

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

Esta versión tendrá 500 píxeles en su lado más largo.

La imagen original:

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

Puede ser cualquier cosa que se haya subido, un .JPG, un .GIF o un .PNG.

Versiones de tamaño específico:

Estos son siempre .JPG:

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

Dónde [size] es uno de:

  • s - cuadrado pequeño 75x75
  • t - miniatura, 100 en su lado más largo
  • metro - pequeño, 240 en su lado más largo
  • z - mediano, 640 en su lado más largo
  • b - grande, 1024 en su lado más largo (sólo existe para imágenes originales muy grandes)

Entonces, la siguiente URL tomada de los resultados del ejemplo devueltos anteriormente extrae la foto que sigue (nótese cómo el z antes de .jpg indica una foto de 640 píxeles de ancho en el tamaño más largo :)

Photo of Motorcycle on Flickr

Armados con toda la información anterior, ahora podemos crear un script PHP usando WordPress. WP_Http clase para recuperar las fotos de nuestro set.Escribí un script simple que puedes copiar en la raíz de tu sitio web y asegurarte de reemplazarlo por el tuyo propio. api_key y photoset_id antes de ejecutarlo:

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;
}

Usando lo anterior con mi clave API y mi ID de Photoset obtengo lo siguiente:

Output of a PHP Script Showing a Flickr Photoset
(fuente: mikeschinkel.com)

Script PHP para publicar una foto de Flickr Photoset en su blog

Basado en todo eso, he escrito una página llamada blog-from-flickr.php que puedes poner en la raíz de tu sitio web y llamar para obtener el siguiente formulario simple:

Blog From Flickr PHP Script for WordPress
(fuente: mikeschinkel.com)

Ingresa un ID de Photoset válido y luego haz clic en ese botón y serás redirigido a una publicación de blog que se parece a esta.

Blog Post Generated from a Flickr Photoset Photo via a PHP Script
(fuente: mikeschinkel.com)

Hacer que todo funcionara fue un poco más complicado que el simple código anterior y me queda más tiempo del que tengo para documentarlo por completo, pero lo publicaré a continuación para que lo revises (y también puedes hacerlo). descárgalo desde aquí).

De especial interés son los siguientes aspectos del código:

  • La secuencia de comandos saca las veinticinco (25) fotos más recientes Del conjunto de fotos y del blog, el primero de ellos.Supuse que querrías subir contenido de forma masiva y luego publicarlo cronológicamente.Si carga más de 25, deberá cambiar el valor de la constante. FLICKR_PHOTO_COUNT a algo más grande, hasta 500 (500 es el límite especificado por Flickr). Aumentarlo sólo aumentará ligeramente el tiempo que tarda el script en ejecutarse;puede que ni siquiera se note.

  • La secuencia de comandos almacena la identificación con foto de Flickr como un campo personalizado oculto en wp_postmeta usando la llave '_flickr_photo_id'.Así es como puedo saber si se ha escrito en un blog antes o no.

  • La secuencia de comandos utiliza un HTTP POST método (es decir.usando un HTML <form>) vs un HTTP GET método (llamando a una URL directamente) a evitar activar accidentalmente el proceso de publicación y para permitir la publicación desde un conjunto de fotos diferente.

  • El guión utiliza current_user_can('publish_posts') a asegúrese de que solo un usuario haya iniciado sesión con derechos de publicación puede desencadenar la lógica de publicación.

  • El guión atrapa las fotos descripción desde Flickr y usarlo como prefijo del <img> etiqueta para el contenido de la publicación (tenga en cuenta que mi captura de pantalla de ejemplo no tenía una descripción, por lo que solo ve la foto).

  • La secuencia de comandos llama a PHP getimagesize() con una URL de la foto para obtener la altura y el ancho de la <img> etiqueta;Si su servidor no está configurado para eso, no obtendrá etiquetas de tamaño y ancho en sus imágenes. (En realidad, el código podría fallar;El mío funciona, así que no pude probarlo.Si falla, lo sabrás.:)

  • No hice el esfuerzo de traer las etiquetas de Flickr y agregarlas como etiquetas, pero sería un ejercicio que valdría la pena para otra persona.

Y eso es todo.Pasando al código...

El código de blog de fotografías de 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;
  }
}

Blogs de fotos de Flickr completamente automáticos

Si necesita ir aún más lejos, puede recodificar lo anterior para usar un pseudo-cron en lugar de activarse en un HTTP. POST.Aquí hay un enlace a algunos artículos que pueden ayudar con eso:

Y si pseudo-cron no es lo suficientemente bueno, siempre puedes cambiar el nombre del script a un nombre oscuro y usar cron real para recuperar esa URL con nombre oscuro.Si necesitas seguir esa ruta, Consulte Google para saber cómo configurar una tarea cron..

En cualquier caso con cron probablemente tendrás que eliminar el current_user_can() código porque no podrás iniciar sesión.

PDObtener su NSID de Flickr (ID de usuario)

Más allá de lo anterior, es posible que necesite obtenga su NSID de Flickr (también conocido como su ID de usuario) Para algunos de los métodos, puede encontrarlo aquí:

PPSAutenticar un script PHP con Flickr es más difícil

Puede observar que ninguno de mis ejemplos utilizados requería que la persona que llama estuviera autenticada.Es un poco más complicado autenticarse, así que si lo necesita, asegúrese de consultar las bibliotecas PHP de Flickr mencionadas, ya que creo que se encargan de eso.

Otros consejos

De hecho, me recomendaría el uso de la incorporada en el mensaje por correo electrónico en lugar funcionalidad. Se configura una dirección de correo electrónico privado (mysupersecretaddress12345@mydomain.com) y enviar tanto las imágenes y sus descripciones a esa dirección. WordPress creará entonces una nueva entrada de su correo electrónico y adjuntar automáticamente la imagen.

Esto es un poco más fácil que FTP.

Licenciado bajo: CC-BY-SA con atribución
scroll top