the_post_thumbnail fallback usando ganchos

2

Estou usando esse grande tema que depende quase inteiramente de widgets e controles deslizantes. Agora eu estou tentando evitar procurando post_thumbnail código de saída em todos os arquivos incluídos, a fim de obter o fallback, que deve então pegar a primeira imagem no post ou, finalmente, exibir a imagem padrão.

Existe uma maneira de controlar isso via functions file?

Qualquer ajuda apreciada.

A solução baseada em post_thumbnail_html filter hook não exibe a imagem em destaque se não estiver definida explicitamente:

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;
}

Outra solução que encontrei em este artigo e é baseada em action hooks diferente faz a coisa como pretendido que exibe (define) a primeira imagem de anexo no post como destaque ou no cenário de último caso exibe (define) a imagem padrão como a imagem em destaque do post:

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');

Agora, eu gosto disso post_thumbnail_html filter hook solution e estou intrigado por ele não funcionar.

Qualquer ajuda apreciada.

    
por daniel.tosaba 11.09.2012 / 06:24

3 respostas

5

você pode usar o gancho de filtro post_thumbnail_html , que passa 5 variáveis para sua função viciada:

  • $html - o html de saída da miniatura da postagem
  • $post_id - o ID do post.
  • $post_thumbnail_id - o id do anexo da imagem
  • $size - o tamanho solicitado ou padrão
  • $attr - string de consulta ou matriz de atributos.

Então, algo como:

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;
}
    
por Bainternet 11.09.2012 / 15:26
3

Como complemento à resposta do @Bainternet:

Recupere o tamanho do conjunto na tabela de opções. Isso significa que a imagem retornada será alinhada com todas as configurações do usuário. Chama o polegar padrão somente do diretório template para contornar casos em que temas-filhos estão presentes e não terão a miniatura.

/**
 * 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 );
    
por kaiser 11.09.2012 / 15:59
0

Lá vai você, acabou de testar e assim funciona bem para mim;)

    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' ));
        }

    }
}
    
por WebCaos 02.10.2013 / 10:12