web-dev-qa-db-fra.com

the_post_thumbnail fallback en utilisant des hooks

J'utilise ce grand thème qui repose presque entièrement sur des widgets et des curseurs. Maintenant, j'essaie d'éviter de chercher le code de sortie post_thumbnail dans tous les fichiers inclus afin d'obtenir un repli qui devrait alors saisir la première image dans le post ou afficher enfin l'image par défaut.

Existe-t-il un moyen de contrôler cela via le fichier functions?

Toute aide appréciée.

La solution basée sur post_thumbnail_htmlfilter hook n'affiche pas l'image sélectionnée si elle n'est pas explicitement définie:

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_fallback', 20, 5 );
function my_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( empty( $html ) ) {
        $image = get_children( "post_parent={$post_id}&post_type=attachment&post_mime_type=image&numberposts=1" );
        if($image){
                foreach ($image as $attachment_id => $attachment) {
                        $src = wp_get_attachment_image_src($attachment_id);
                 return printf(
                                 '<img src="%s" height="%s" width="%s" />'
                                ,$src[0]
                                ,get_option( 'thumbnail_size_w' )
                                ,get_option( 'thumbnail_size_h' )
                                );
            }
         } 
         else {
               return printf(
                                 '<img src="%s" height="%s" width="%s" />'
                                ,get_template_directory_uri().'/images/featured/featured.jpg'
                                ,get_option( 'thumbnail_size_w' )
                                ,get_option( 'thumbnail_size_h' )
                                );
         }  
    } 
        return $html;
}

Une autre solution que j'ai trouvée dans cet article et qui repose sur différents action hooks fonctionne comme prévu, ce qui affiche (définit) la première image de pièce jointe dans l'article tel que décrit ou, dans le dernier cas, affiche (définit) l'image par défaut telle que l'article. image sélectionnée:

function autoset_featured() {
          global $post;
          $already_has_thumb = has_post_thumbnail($post->ID);
              if (!$already_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);
                                }
                           } else {
                                set_post_thumbnail($post->ID, '414');
                           }
                        }
      }  //end function
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');

Maintenant .. J'aime cette solution post_thumbnail_htmlfilter hook et cela ne m'intrigue pas.

Toute aide appréciée.

2
daniel.tosaba

vous pouvez utiliser le crochet de filtre post_thumbnail_html qui transmet 5 variables à votre fonction accrochée:

  • $html - le HTML de sortie de la miniature de publication
  • $post_id - l'identifiant de la publication.
  • $post_thumbnail_id - l'ID de pièce jointe de l'image
  • $size - la taille demandée ou par défaut
  • $attr - Chaîne de requête ou tableau d'attributs.

Donc, quelque chose comme:

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_fallback', 20, 5 );
function my_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( empty( $html ) ) {
        // return you fallback image either from post of default as html img tag.
    }
    return $html;
}
5
Bainternet

En complément de @Bainternet, répondez:

Récupérez la taille définie dans la table d'options. Cela signifie que l'image renvoyée s'alignera avec tous les paramètres utilisateur. Appelle le curseur par défaut uniquement à partir du répertoire template afin de contourner les cas où des thèmes enfants sont présents et ne possèdent pas la vignette.

/**
 * Default post thumbnail image.
 * 
 * @param  string $html The Output HTML of the post thumbnail
 * @param  int $post_id The post ID
 * @param  int $post_thumbnail_id The attachment id of the image
 * @param  string $size The size requested or default
 * @param  mixed string/array $attr Query string or array of attributes
 * @return string $html the Output HTML of the post thumbnail
 */
function wpse64763_post_thumbnail_fb( $html, $post_id, $post_thumbnail_id, $size, $attr )
{
    if ( empty( $html ) )
    {
        return sprintf(
            '<img src="%s" height="%s" width="%s" />',
            get_template_directory_uri().'/path/to/default-thumb.png',
            get_option( 'thumbnail_size_w' ),
            get_option( 'thumbnail_size_h' )
        );
    }

    return $html;
}
add_filter( 'post_thumbnail_html', 'wpse64763_post_thumbnail_fb', 20, 5 );
3
kaiser

Voilà, viens de tester et comme ça marche bien pour moi;)

    add_filter( 'post_thumbnail_html', 'wc_post_thumbnail_fallback', 20, 5 );
function wc_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
   if ($html) {
        return $html;
    }else {
        $args = array(
            'numberposts' => 1,
            'order' => 'ASC',
            'post_mime_type' => 'image',
            'post_parent' => $post_id,
            'post_status' => null,
            'post_type' => 'attachment',
        );

        $images = get_children($args);

        if ($images) {
            foreach ($images as $image) {
                return wp_get_attachment_image($image->ID, $size);
            }
        }else{
            printf('<img src="%s" height="%s" width="%s" />'
                ,get_template_directory_uri().'/images/featured/featured.jpg'
                ,get_option( 'thumbnail_size_w' )
                ,get_option( 'thumbnail_size_h' ));
        }

    }
}
0
WebCaos