web-dev-qa-db-fra.com

Définir automatiquement l'image sélectionnée

Comment pourrais-je changer chaque message pour qu'il ait la même image sélectionnée codée en dur?! Dites ce cigare:

https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg

(Je ne veux pas vraiment faire cela, mais c'est une pierre d'achoppement dans quelque chose de plus complexe.)

Je pense que ça devrait être ça:

function set_post_thumbnail( $post, $thumbnail_id ) {
    $thumbnail_id = "https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg";
    update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id );

}

add_action( 'save_post', 'set_post_thumbnail' );

... mais pas de cigare. Qu'est-ce que je rate? Merci!

4
JohnG

Méthode 1: Utiliser le publish_post hook * et media_sideload_image()

Ici, nous allons télécharger une image à partir d'une URL, la joindre à l'article et la définir comme image sélectionnée lors de la publication de l'article.

* En fait, nous utilisons le hook dynamique {$new_status}_{$post->post_type}, qui désigne la transition d'un type de message post au statut publish. Voir wp-includes/post.php pour plus de détails.

Cet exemple de code s'applique lors de la publication du type d'article post. Une vérification est en place afin que nous n'assignions pas automatiquement l'image sélectionnée, si celle-ci a été définie manuellement. N'hésitez pas à personnaliser cela comme vous le souhaitez.

/**
 * Download image, attach it to the current post, and assign it as featured image
 * upon publishing the post.
 *
 * The dynamic portions of the hook name, `$new_status` and `$post->post_type`,
 * refer to the new post status and post type, respectively.
 *
 * Please note: When this action is hooked using a particular post status (like
 * 'publish', as `publish_{$post->post_type}`), it will fire both when a post is
 * first transitioned to that status from something else, as well as upon
 * subsequent post updates (old and new status are both the same).
 *
 * @param int     $post_id Post ID.
 * @param WP_Post $post    Post object.
 */
add_action( 'publish_post', 'wpse_default_featured_image', 10, 2 );
function wpse_default_featured_image( $post_id, $post ) {
    // Bail if there is already a post thumbnail set.
    $current_post_thumbnail = get_post_thumbnail_id( $post_id );
    if ( '' !== $current_post_thumbnail ) {
        return;
    }

    $url = 'https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg';
    $title = "The default featured image.";

    $image = media_sideload_image( $url, $post_id, $title, 'id' );
    set_post_thumbnail( $post_id, $image );
}

Méthode 2: application d'un filtre à la vignette du message.

En utilisant un filtre, nous pouvons "virtuellement" définir la vignette du message. Cette méthode facilite le changement de la vignette de publication à la volée pour toutes les publications.

Filtre 1: post_thumbnail_html

Le filtre post_thumbnail_html peut être utilisé pour remplacer la sortie HTML de la vignette de publication:

/**
 * Filters the post thumbnail HTML.
 *
 * @param string       $html              The post thumbnail HTML.
 * @param int          $post_id           The post ID.
 * @param string       $post_thumbnail_id The post thumbnail ID.
 * @param string|array $size              The post thumbnail size. Image size or array of width and height
 *                                        values (in that order). Default 'post-thumbnail'.
 * @param string       $attr              Query string of attributes.
 */
add_filter( 'post_thumbnail_html', 'wpse_post_thumbnail_html', 10, 5 );
function wpse_post_thumbnail_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    return '<img src="https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg" alt="Have a cigar">';
}

Filtre 2: Utilisation de get_post_metadata sur la clé méta _thumbnail_id.

Voici une autre approche qui remplace l'identifiant de vignette de chaque message par un identifiant différent.

Je suggèrerais de mettre en place un paramètre ou une page d'options du Customizer permettant à l'image miniature spéciale d'être téléchargée/sélectionnée (localement, à partir d'une URL ou de la bibliothèque multimédia). Ensuite, vous pouvez utiliser le filtre get_post_metadata pour modifier la valeur associée à la clé méta de chaque miniature de publication _thumbnail_id:

/**
 * Dynamic hook: "get_{$meta_type}_metadata"
 * 
 * Filters whether to retrieve metadata of a specific type.
 * 
 * The dynamic portion of the hook, `$meta_type`, refers to the meta
 * object type (comment, post, or user). Returning a non-null value
 * will effectively short-circuit the function.
 *
 * @param null|array|string $value     The value get_metadata() should return - a single metadata value,
 *                                     or an array of values.
 * @param int               $object_id Object ID.
 * @param string            $meta_key  Meta key.
 * @param bool              $single    Whether to return only the first value of the specified $meta_key.
 */
add_filter( 'get_post_metadata', 'wpse_featured_image_id_override', 100, 4 );
function wpse_featured_image_id_override( $value, $object_id, $meta_key, $single ) {
    $thumbnail_id_key = '_thumbnail_id';

    // Bail if this is not the correct meta key. Return the original value  immediately.
    if ( ! isset( $meta_key ) || $thumbnail_id_key !== $meta_key ) {
        return $value;
    }

    // Add additional guard clauses if necessary... (check post type, etc.)

    // Get the id for an image uploaded elsewhere.
    // This could be pulled from the customizer or a plugin options page.
    return 807;  // Example ID
}
3
Dave Romsey

Vous pouvez simplement écraser l’image présentée (qu’elle soit définie ou non) lors de l’enregistrement de la page/publication avec ceci:

//this is called on saving page/post
add_action('save_post', 'force_featured_image');

function force_featured_image( $post_id ){
   //set the featured image
   set_post_thumbnail( $post_id, [image_id] );
}

NOTERemplacez '[image_id]' par votre identifiant d'image.

3
Phill Healey