web-dev-qa-db-fra.com

Image vedette héritée de la page parent

Ce que j'aimerais faire, c'est que les images en vedette de ma page parent soient affichées. À moins qu'une page enfant ne possède sa propre image en vedette, j'aimerais que cette image devienne l'image en vedette de cette page et du reste de ses pages pour enfants.

-Page 1
-Page 2
  -Sub Page 1
  -Sub Page 2
    -Sub Sub Page 1 
    -Sub Sub Page 2

Donc, dans l'exemple ci-dessus:
Page 1 et Page 2 aurait une vedette jeu d'images à afficher dans l'en-tête.
La sous-page 1 hériterait Page 2 .
La sous-page 2 aurait sa propre image sélectionnée, laquelle la sous-page 1 hériterait.
Sous-sous-page 2 aurait sa propre image sélectionnée.

J'ai essayé de placer ce code dans mon en-tête, où l'image doit être insérée et où aucune image sélectionnée n'a été dessinée, mais simplement le curseur d'image:

<?php if ( has_post_thumbnail($post->post_parent, 'pagethumb') ) {
                 echo get_the_post_thumbnail($post->post_parent, 'pagethumb');
                 } else {
                 echo do_shortcode('[rev_slider header-slider-bw]');
             } ?>

J'ai également testé pour m'assurer que l'image était là et que je travaillais avec ce code (et c'était le cas):

if ( has_post_thumbnail() ) {
the_post_thumbnail();
} 

Quelqu'un a-t-il un conseil pour y arriver? J'apprécie toute aide. Merci d'avance!

3
JHP

C’est ma proposition, combinez get_ancestors et une requête personnalisée $wpdb pour récupérer les images en vedette.

Un exemple de fonction personnalisée:

function inherited_featured_image( $page = NULL ) {
  if ( is_numeric( $page ) ) {
    $page = get_post( $page );
  } elseif( is_null( $page ) ) {
    $page = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : NULL;
  }
  if ( ! $page instanceof WP_Post ) return false;
  // if we are here we have a valid post object to check,
  // get the ancestors
  $ancestors = get_ancestors( $page->ID, $page->post_type );
  if ( empty( $ancestors ) ) return false;
  // ancestors found, let's check if there are featured images for them
  global $wpdb;
  $metas = $wpdb->get_results(
    "SELECT post_id, meta_value
    FROM {$wpdb->postmeta}
    WHERE meta_key = '_thumbnail_id'
    AND post_id IN (" . implode( ',', $ancestors ) . ");"
  );
  if ( empty( $metas ) ) return false;
  // extract only post ids from meta values
  $post_ids = array_map( 'intval', wp_list_pluck( $metas, 'post_id' ) ); 
  // compare each ancestor and if return meta value for nearest ancestor 
  foreach ( $ancestors as $ancestor ) {
    if ( ( $i = array_search( $ancestor, $post_ids, TRUE ) ) !== FALSE ) {
      return $metas[$i]->meta_value;
    }
  }
  return false;
}

Cette fonction prend un identifiant de page, un objet de page ou rien dans un modèle de page unique et renvoie l'image sélectionnée de l'ancêtre le plus proche.

(Pour être honnête, cela fonctionne pour tout type d'article hiérarchique, pas seulement pour les pages).

Vous pouvez l'utiliser dans un modèle de page unique comme ceci:

if ( has_post_thumbnail() ) {
  the_post_thumbnail( 'pagethumb' );
} else {
  $img = inherited_featured_image();
  if ( $img ) {
    echo wp_get_attachment_image( $img, 'pagethumb' );
  }
}

Cela devrait fonctionner, mais il est un peu médiocre car il nécessite 2 requêtes de base de données et du travail supplémentaire. Donc, probablement, il peut être une bonne idée d’utiliser la fonction dans le backend, et quand une page est enregistrée, vérifiez si une image sélectionnée existe, sinon héritez-la.

Si ensuite vous voulez le changer, vous pouvez bien sûr ...

add_action( "save_post_page", "inherited_featured", 20, 2 );

function inherited_featured( $pageid, $page ) {
  if ( has_post_thumbnail( $pageid ) ) return;
  $img = inherited_featured_image();
  if ( $img ) {
     set_post_thumbnail( $page, $img );
  }
}

Celui-ci fonctionnera, bien sûr, pour les nouvelles pages ou pour les pages que vous mettrez à jour après après l'avoir inséré, afin que vous puissiez utiliser les deux extraits précédents: de cette manière les pages existantes hériteront de la miniature à la volée .

3
gmazzap