web-dev-qa-db-fra.com

Champs personnalisés avancés - Obtenir des champs personnalisés à partir de la page parente

J'utilise Advanced Custom Fields, ce qui permet à mon client de gérer plus facilement son contenu.

Sur toutes les pages de mes enfants et de mes parents, j'aimerais avoir la même image d'en-tête et les mêmes informations sur la barre latérale.

Bien que je souhaite faire en sorte que "Page parent 1" et "Page parent 2" aient des informations différentes et ceci est contrôlé avec des champs personnalisés avancés par le client.

Pour le moment, la clé va à chaque page parent et enfant pour renseigner manuellement les informations - je voudrais qu'elles ne soient renseignées que sur la page Parent. Rendre les pages enfants obtenir les informations de leur page parent.

Parent Page # 1

  • Page enfant 1 - Devrait obtenir les valeurs de champ personnalisé de "Page parent 1"
  • Child page # 2 - Devrait obtenir les valeurs de champ personnalisé de "Parent Page 1"
  • Page enfant 3 - Devrait obtenir les valeurs de champ personnalisé de "Page parent 1"

Parent Page # 2

  • Enfant page n ° 1 - Devrait obtenir les valeurs de champ personnalisé de "Parent Page 2"
  • Child page # 2 - Devrait obtenir les valeurs de champ personnalisé de "Parent Page 2"
  • Enfant page n ° 3 - Devrait obtenir les valeurs de champs personnalisés de "Parent Page 2"

Alors voici ma question.

Sur mon "modèle de page parent", j'utilise les éléments suivants pour générer l'image:

<img src="<?php the_field('header_image'); ?>">

Alors, comment puis-je, sur mon "modèle de page enfant", obtenir le champ "image-en-tête" à partir de la page parent de la page enfant?

5
Mikkel Tschentscher

Dans votre boucle, vous pouvez accéder à l'ID de la page parent avec $post->post_parent.

Il vous suffit de passer cette valeur en tant que second paramètre:

<img src="<?php the_field('header_image', $post->post_parent ); ?>">
8
RRikesh

Au moment où le fichier de modèle est inclus, la requête pour la page a déjà été exécutée et la variable globale $ post contient un objet WP_Post. Voici un exemple de vidage du $post:

WP_Post::__set_state(array(
   'ID' => 3440,
   'post_author' => '1',
   'post_date' => '2013-08-19 13:06:04',
   'post_date_gmt' => '2013-08-19 13:06:04',
   'post_content' => '',
   'post_title' => 'Models',
   'post_excerpt' => '',
   'post_status' => 'publish',
   'comment_status' => 'open',
   'ping_status' => 'closed',
   'post_password' => '',
   'post_name' => 'models',
   'to_ping' => '',
   'pinged' => '',
   'post_modified' => '2013-08-23 14:32:57',
   'post_modified_gmt' => '2013-08-23 14:32:57',
   'post_content_filtered' => '',
   'post_parent' => 3442,
   'guid' => 'http://charlesclarkson.com/?page_id=3440',
   'menu_order' => 0,
   'post_type' => 'page',
   'post_mime_type' => '',
   'comment_count' => '0',
   'filter' => 'raw',
   'format_content' => NULL,
))

Comme vous pouvez le constater, il existe une propriété dans cet objet nommée post_parent. Pour y accéder, utilisez $post->post_parent. Les pages de niveau supérieur ont un parent de publication défini sur '0'.

Selon les documents ACF pour the_field() , il existe un deuxième paramètre permettant de transmettre un identifiant de publication à la fonction.

En supposant que le code dans votre modèle de page ne soit pas foutu avec $post:

<img src="<?php the_child_or_parent_image_src(); ?>">

<?php
function the_child_or_parent_image_src() {
    global $post;

    if ( $post->post_parent )
        the_field( 'header_image',  $post->post_parent );

    the_field( 'header_image' );
}
?>

(Remarque: le code n'est pas bien testé.)

1
Charles Clarkson

Qu'en est-il de:

<img src="<?php $parent_header_image = get_post_meta($post->post_parent, 'header_image', true); echo $parent_header_image;?>">

Je n'ai pas votre configuration, évidemment, donc je ne peux pas vraiment tester cela, mais cela semble solide. Notez que cela n’affiche que vos données parent dans le modèle frontal et qu’elles ne seront ni affichées ni renseignées dans l’administrateur de la page enfant.

1
Angelique