web-dev-qa-db-fra.com

Obtenir des post-vignettes d'un autre WP site

J'ai deux installations WordPress, l'une sur http://inversekarma.in et l'autre sur http://inversekarma.in/photos . Ce dernier est un photoblog et son thème utilise le standard WP post-vignettes ( EDIT: images en vedette, pour être précis!). Est-il possible d'afficher les vignettes les plus récentes du deuxième site dans l'encadré de mon premier site?

4
GPX

Il y a (au moins) deux (2) façons d'aborder ceci:

  1. Vous pouvez interroger la deuxième base de données , ce qui vous obligera à conserver les informations d'identification de la base de données à deux endroits, ou au moins dans un fichier à inclure, ou

  2. Vous pourriez créer un flux JSON simple pour votre blog photo, utiliser le flux de votre blog principal et le mettre en cache pendant une courte période. Cela entraînera une légère latence lors du chargement de la page lorsque le cache expirera, mais comme les deux sont sur le même ordinateur, cela ne devrait pas être un problème.

Faites-moi savoir ce que vous préférez et si je mettrai à jour la réponse afin que vous comment.

METTRE À JOUR

Pour vous connecter à une autre base de données, vous pouvez en savoir plus ici:

Voici donc ce que j'ai hacké pour vous, une fonction appelée show_thumbnails_2nd_db() que vous pouvez copier dans le fichier functions.php de votre thème:

function show_thumbnails_2nd_db() {
  global $wpdb;
  global $table_prefix;
  $save_wpdb = $wpdb;
  $save_prefix = $table_prefix;
  include_once(ABSPATH . '/photos/database-credentials.php');
  extract($database_credentials);
  $wpdb = new wpdb($DB_USER, $DB_PASSWORD, $DB_NAME, $DB_Host);
  wp_set_wpdb_vars();

  // This is the code for featured images  
  $sql = <<<SQL
SELECT DISTINCT CONCAT('<img src="',attachment.guid,'"/>') AS url
FROM 
  {$wpdb->posts} attachment
  INNER JOIN {$wpdb->postmeta} ON attachment.ID={$wpdb->postmeta}.meta_value AND {$wpdb->postmeta}.meta_key='_thumbnail_id'
  INNER JOIN {$wpdb->posts} ON {$wpdb->posts}.ID={$wpdb->postmeta}.post_id
WHERE {$wpdb->posts}.post_status='publish'
  AND attachment.post_type='attachment'
ORDER BY attachment.ID DESC
LIMIT 10
SQL;
  $post_urls = $wpdb->get_col($sql);
  if (is_array($post_urls))
    echo implode("\n",$post_urls);

// This is the code for post thumbnails  
//   $sql = <<<SQL
// SELECT DISTINCT {$wpdb->posts}.ID
// FROM {$wpdb->posts}
// INNER JOIN {$wpdb->posts} attachment
//    ON {$wpdb->posts}.ID=attachment.post_parent
// WHERE {$wpdb->posts}.post_status='publish'
//   AND attachment.post_type='attachment'
// ORDER BY attachment.ID
// LIMIT 10
// SQL;
//   $post_ids = $wpdb->get_col($sql);
//   foreach($post_ids as $post_id) {
//     $thumbnail = get_the_post_thumbnail($post_id);
//     if ($thumbnail) {
//       echo $thumbnail;
//     }
//   }
  $table_prefix = $save_prefix;
  $wpdb = $save_wpdb;
}

Note: Que ce qui précède suppose que vous avez créé un database-credentials.php à la racine de votre blog de photos et qu'il devrait ressembler à ceci:

<?php    
$database_credentials = array(
  'DB_NAME' =>  'your_database',
  'DB_USER' =>  'your_db_user',
  'DB_PASSWORD' =>  'your db password',
  'DB_Host' =>  'localhost',
  'table_prefix' => 'your_photos_db_prefix_',
);

Puis dans le /wp-config.php pour votre photos blog vous voudriez remplacer les sections de code qui ressemblent à ceci:

// ** MySQL settings - You can get this info from your web Host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'your_database');

/** MySQL database username */
define('DB_USER', 'your_db_user');

/** MySQL database password */
define('DB_PASSWORD', 'your db password');

/** MySQL hostname */
define('DB_Host', 'localhost');

Et ça:

$table_prefix  = 'wp_';

Avec ça:

include_once(ABSPATH . '/database-credentials.php');

// ** MySQL settings - You can get this info from your web Host ** //
/** The name of the database for WordPress */
define('DB_NAME', $database_credentials['DB_NAME']);

/** MySQL database username */
define('DB_USER', $database_credentials['DB_USER']);

/** MySQL database password */
define('DB_PASSWORD', $database_credentials['DB_PASSWORD']);

/** MySQL hostname */
define('DB_Host', $database_credentials['DB_Host']);

$table_prefix  = $database_credentials['table_prefix'];

Si vous avez besoin de plus d'explications, il suffit de demander dans les commentaires.

6
MikeSchinkel

La réponse de Mike est excellente, mais j'utiliserais une requête SQL différente, car le GUID de la publication de la pièce jointe peut changer lorsque vous changez de serveur ou déplacez le blog. Ma version vous donne également accès aux informations de la publication de blog, ce qui est utile si vous souhaitez créer un lien vers celle-ci.

SELECT post.ID, post.post_title, attachment_meta.meta_value AS upload_relative_path
FROM {$wpdb->posts} AS post
    JOIN {$wpdb->postmeta} AS post_meta ON (post_meta.post_id = post.ID AND post_meta.meta_key = '_thumbnail_id')
    JOIN {$wpdb->postmeta} AS attachment_meta ON (attachment_meta.post_id = post_meta.meta_value AND attachment_meta.meta_key = '_wp_attached_file')
WHERE post.post_status = 'publish'
    AND post.post_type = 'post'
ORDER BY post.post_date DESC
LIMIT 10

Au lieu de _wp_attached_file, vous pouvez également obtenir la valeur _wp_attachment_metadata, qui contient des informations supplémentaires sur l'image et les tailles alternatives.

2
Jan Fabry