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?
En ce qui concerne le code que vous avez posté, je dirais certaines choses:
'save_post'
est déclenché chaque fois qu'une publication est créée ou mise à jour$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+
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');
" 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é.