web-dev-qa-db-fra.com

Définir par programme la première image comme étant sélectionnée

J'ai plus de 400 articles contenant des images, j'ai un nouveau modèle qui requiert une image sélectionnée pour chaque article, ce que mon dernier modèle n'exigeait pas ... Je me demande s'il y a un script que je peux ajouter à mes fonctions. php pour pouvoir saisir la première image dans chaque publication et la définir comme la vedette ... Jusqu'à présent, j'ai trouvé cela, mais cela ne fonctionne pas ...

function auto_set_featured() {
global $post;
$has_thumb = has_post_thumbnail($post->ID);
if (!$has_thumb)  {
$attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
    if ($attached_image) {
        foreach ($attached_image as $attachment_id => $attachment) {
            set_post_thumbnail($post->ID, $attachment_id);
        }
    }
}
}
add_action('the_post', 'auto_set_featured');
add_action('save_post', 'auto_set_featured');
add_action('draft_to_publish', 'auto_set_featured');
add_action('new_to_publish', 'auto_set_featured');
add_action('pending_to_publish', 'auto_set_featured');
add_action('future_to_publish', 'auto_set_featured');

Ce script fonctionnera pour les nouveaux messages, mais j'en ai besoin pour affecter tous mes messages plus anciens, des suggestions?

6
user2820604

En ce qui concerne le code que vous avez posté, je dirais certaines choses:

  • vous pouvez éviter d'utiliser 6 actions différentes car une seule suffit: 'save_post' est déclenché chaque fois qu'une publication est créée ou mise à jour
  • vous pouvez déposer globalize $post: 'save_post' transmettra l'ID de publication, vous pourrez l'utiliser. De plus, préparer la fonction pour recevoir un argument vous aidera à exécuter la même fonction par programme.

La version modifiée de votre code devient:

function auto_set_featured( $post = NULL ) {
  // retrieve post object
  $post = get_post( $post ); 
  // nothing to do if no post, or post already has thumbnail
  if ( ! $post instanceof WP_Post || has_post_thumbnail( $post->ID ) )
     return;
  // prepare $thumbnail var
  $thumbnail = NULL;
  // retrieve all the images uploaded to the post
  $images    = get_posts( array(
    'post_parent'    => $post->ID,
    'post_type'      => 'attachment',
    'post_status'    => 'inherit',
    'post_mime_type' => 'image',
    'posts_per_page' => 1
  ) );
  // if we got some images, save the first in $thumbnail var
  if ( is_array( $images ) && ! empty( $images ) )
     $thumbnail = reset( $images );
  // if $thumbnail var is valid, set as featured for the post
  if ( $thumbnail instanceof WP_Post )
     set_post_thumbnail( $post->ID, $thumbnail->ID );
}

add_action( 'save_post', 'auto_set_featured' );

Désormais, la seule chose dont vous avez besoin pour les anciens articles, est de les récupérer avec une requête, puis d'exécuter la même fonction pour chaque article.

Il suffit de garder l’attention pour exécuter la tâche une seule fois: c’est une tâche très consommatrice de temps et de ressources, elle ne doit donc être exécutée qu’une seule fois, éventuellement sur le backend.

Je vais utiliser un transitoire dans le but:

add_action( 'admin_init', function() {

  if ( (int) get_transient(' bulk_auto_set_featured' ) > 0 )
     return;

  $posts = get_posts( 'posts_per_page=-1' ) ;
  if ( empty( $posts ) )
    return;

  array_walk( $posts, 'auto_set_featured' );

  set_transient( 'bulk_auto_set_featured', 1 );
});

Après avoir ajouté ce code à votre functions.php ou à un plugin, connectez-vous au backend et préparez-vous à attendre quelques secondes avant que le tableau de bord n'apparaisse, mais toutes les publications doivent avoir une vignette, au moins toutes les publications contenant une image téléchargée. .

Si tout se passe comme il se doit, vous pouvez supprimer le dernier extrait de code en ne conservant que le premier.

Notez que mon code nécessite php 5.3+

3
gmazzap

Utilisez ce code dans votre fichier de fonctions de thèmes enfants et eux régénérer les vignettes

function wpsites_auto_set_featured_image() {
      global $post;
      $featured_image_exists = has_post_thumbnail($post->ID);
          if (!$featured_image_exists)  {
          $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                      if ($attached_image) {
                            foreach ($attached_image as $attachment_id => $attachment) {
                            set_post_thumbnail($post->ID, $attachment_id);
                            }
                       }
                    }
  }
add_action('the_post', 'wpsites_auto_set_featured_image');
2
Brad Dalton

" Définissez toutes les premières images comme indiqué " a fonctionné pour moi.

Avec un hack, l'opération pourrait être inversée.

Easy Add Thumbnail peut aussi faire l'affaire, et la version pro de Quick Featured Images le fait, et je pense avoir vu un autre plug-in le faire lorsque j'ai recherché.

0
r_alex_hall