web-dev-qa-db-fra.com

Obtenir une image en vedette sur l'index du blog

J'ai essayé d'utiliser "l'image en vedette" de la maison (l'index des blogs) sans succès. Cela fonctionne pour chaque page, mais pas pour la maison.

Le code ressemble à ceci:

// Don't use on single posts
    if (!is_single()) {
        if (is_home()) {
            if (function_exists('wp_get_attachment_thumb_url')) {
                $img = wp_get_attachment_image_src(get_post_thumbnail_id(),'full');
                $featured_image = $img[0];
            }
        } else {
            if (function_exists('wp_get_attachment_thumb_url') && has_post_thumbnail()) {
                $img = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID),'full');
                $featured_image = $img[0];
            }
        }
        if ($featured_image) { ?>
            // A lot of code...
        <?php }
    }

J'ai déjà essayé d'obtenir la vignette à l'aide de _thumbnail_id meta. Même résultat.

Ce code est placé sur le fichier de fonctions, je pense que le problème est qu’il essaie d’obtenir la boucle/les messages en vedette.

Merci beaucoup d'avance.

6
demogar

si vous vous référez à la 'page pour les articles', essayez alors (seule la section pertinente de votre code est affichée):

if (is_home() && get_option('page_for_posts') ) {
    $img = wp_get_attachment_image_src(get_post_thumbnail_id(get_option('page_for_posts')),'full'); 
    $featured_image = $img[0];
} else { 
13
Michael

Je suggérerais à quiconque de le faire de considérer les ajustements suivants:

  1. Obtenez l'ID de la page/publication/index en cours à l'aide de get_queried_object(). Pour un index de blog défini sur une page, l'ID de page correct sera renvoyé.
  2. Si vous ne souhaitez que l'image complète, utilisez wp_get_attachment_url() au lieu de wp_get_attachment_image_src()

Voici une fonction rapide que j'utiliserais pour y parvenir d'une manière plus simple:

/**
 * Custom Featured Image
 */
function custom_featured_image() {
    $queried_obj = get_queried_object();

    // Don't use on single posts (JUST FOR THIS DEMO)
    if ( is_single() ) return;

    // Get the featured image ID
    $image_id = get_post_thumbnail_id( $queried_obj->ID );

    // Get the URL for the full sized image
    $image_src = wp_get_attachment_url( $image_id );

    return $image_src;
}

Personnellement, j'aime éviter une logique conditionnelle imbriquée excessive, l'utilisation d'une fonction peut y contribuer.

0
Kevin Leary

Vous avez 2 options rapides, via le fichier modèle en utilisant the_post_thumbnail pour la boucle. Je suppose que votre sortie des données dans un format de blog typique et que votre fonction ci-dessus ne fonctionnera pas ou ne sera pas très bizarre dans la boucle.

Essayez plutôt quelque chose comme ceci dans le fichier de modèle actuel où se trouve votre boucle principale (peut-être index.php ou loop.php):

  //loop starts
   if ( has_post_thumbnail() ) { 
   the_post_thumbnail();
   }
   //the_content(); and other stuff
   //loop ends

Ou si vous souhaitez utiliser une action pour modifier la boucle principale, vous pouvez utiliser pre_get_posts, par exemple dans votre fichier functions.php.

Quelque chose comme:

add_action( 'pre_get_posts', 'add_featured_image' );

function add_featured_image( $query ) {

    if( $query->is_main_query() && $query->is_home() ) {
        //your image code
    }

}

Notez que ce qui précède est en train de vérifier 2 paramètres, la requête principale et la page d’accueil, il est très important de vérifier s’il s’agit de la requête principale, sinon toutes les requêtes seront modifiées.

Référence: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

0
Wyck

Cela marche..

<section id="banner" style="background-image: <?php if (is_home() && get_option('page_for_posts') ) {
    $blog_home_id = get_option( 'page_for_posts' );
    echo 'url('.get_the_post_thumbnail_url($blog_home_id, 'full').')'; 
} else { 
echo 'url('.get_the_post_thumbnail_url($post->ID, 'full').')';
}
?>;">

J'espère que cela t'aides!

0
troychroi