Je souhaite que WordPress renvoie la première image de publication ou une image par défaut si aucune image sélectionnée n'a été définie. Mon thème utilise the_post_thumbnail
plusieurs fois, aussi je ne souhaite pas modifier toutes les références à une nouvelle fonction. Je préfère filtrer le noyau. Voici ce que j'ai ajouté à functions.php
:
add_filter('post_thumbnail_html', 'my_thumbnail_html', 10, 5);
function my_thumbnail_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
global $post, $posts;
if (has_post_thumbnail() ) {
echo get_the_post_thumbnail( null, $size, $attr );
}
else {
$first_img = '';
ob_start();
ob_end_clean();
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
$first_img = $matches [1] [0];
if(empty($first_img)){
$first_img = get_bloginfo("template_url") . '/images/default.gif';
}
return $first_img;
}
}
Comment puis-je accrocher ceci correctement?
Deviner:
function get_attachment_id_from_src( $image_src ) {
global $wpdb;
$query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
$id = $wpdb->get_var($query);
return $id;
}
add_filter( 'post_thumbnail_html', 'my_post_image_html', 10, 5 );
function my_post_image_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
if( '' == $html ) {
global $post, $posts;
ob_start();
ob_end_clean();
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
$first_img = $matches [1] [0];
if ( empty( $first_img ) ){
$image_id = 129; // default image ID
}
else {
$image_id = get_attachment_id_from_src($first_img);
}
$html = wp_get_attachment_image( $image_id, $size, false, $attr );
}
return $html;
}
En fait, aucun filtre the_post_thumbnail
n'est appliqué nulle part.
Celui que vous pouvez essayer d’utiliser et de modifier le contenu qui passe à la fonction the_post_thumbnail
est le filtre post_thumbnail_html
appelé avec les arguments suivants $html, $post_id, $post_thumbnail_id, $size, $attr
.