M é m o - l a b .
Il est possible d’ajouter des champs personnalisés à un type de contenu (articles ou CPT). Ces champs fonctionnent sur le principe clé / valeur.
Notions abordées: get_post_meta(), meta_query.
Les champs additionnels sont disponibles dans la partie admin en cliquant sur le bouton « outils et options » représenté par 3 points verticaux et situé en haut à droite de l’interface. On peur ainsi donner à la meta_key clé) le nom de la page et à la meta_value un nom définissant l’article que l’on crée. Cette technique nous permet d’éviter d’utiliser le plugin ACF par lequel nous pourrions passer pour ajouter de nouveaux champs à nos articles.
Exemple 1 :
On peut par exemple vouloir afficher les contenus selon un ordre bien précis. On crée un champ personnalisé dont la clé prend la valeur « order ». La valeur de cette clé est différente pour chaque contenu et correspondant à la position de celui-ci lors de l’affichage.
La compréhension par le code
template.php
// Loop affichant les contenus dans un ordre croissant
<?php
$q = new WP_Query([
'post_type' => 'wptutos',
'orderby' => 'meta_value',
'meta_query' => [
[
'key' => 'order',
'type' => 'numeric'
]
],
'posts_per_page' => -1,
]);
?>
<?php if ($q->have_posts()) : while ($q->have_posts()) : $q->the_post(); ?>
<h1><?php the_title(); ?></h1>
<p><?php the_content(); ?></p>
...
<?php endwhile; endif; ?>
Exemple 2 :
Il peut être nécessaire de vouloir filtrer les contenus avant affichage. Prenons comme exemple un site proposant la vente de biens immobiliers. Un champ personnalisé sera utilisé pour préciser le prix de ce bien et un autre pour préciser la localisation du bien.
La compréhension par le code
template.php
<?php
// Affichage de tous les biens
$q = new WP_Query([
// <nom_du_cpt> est égal à post pour les articles
'post_type' => '<nom_du_cpt>',
'posts_per_page' => -1
]);
?>
// Affichage de tous les biens
<?php if ($q->have_posts()) : while ($q->have_posts()) : $q->the_post(); ?>
<h2><?php echo the_title(); ?> (id=<?php echo get_the_ID(); ?>)</h2>
<p><?php echo the_content(); ?></p>
<p>Prix : <?php echo get_post_meta(get_the_ID(), 'prix', true); ?> €</p>
<p>Lieu : <a href="<?php echo get_post_meta(get_the_ID(), 'localisation', true); ?>" target="_blank">google map</a></p>
<?php endwhile; endif; ?>
Rqe : si l'on souhaite filtrer et ne récupérer que
les biens immobiliers dont le prix est compris entre
100000€ et 150000€ par exemple, la requête devient :
<?php
$q = new WP_Query([
'post_type' => 'post',
'meta_query' => [
[
'key' => 'prix',
'value' => [100000, 150000],
'compare' => 'BETWEEN'
]
],
'posts_per_page' => -1
]);
?>
Rqe : pour activer les chps additionnels dans un cpt, il faut ajouter ‘custom-fields’ dans supports. Cf chapitre les Custom Post Types.
Exemple 3 :
Ce système de champs personnalisés peut nous permettre de filtrer, à chaque affichage d’une page, les contenus correspondant à celle-ci.
template.php
<?php
$q = new WP_Query([
'post_type' => 'post',
'meta_query' => [
[
'key' => 'page',
'value' => 'homepage'
]
],
'posts_per_page' => -1
]);
// Création d'un tableau de contenus qui pourront
// être affichés à l'endroit désiré de la page
// A patrir du tableau d'objet $q->posts, nous créons un tableau
//d'objets ($contents) qui nous permet d'identifier chaque contenu
//par son slug (post_name).
$contents = [];
foreach ($q->posts as $content) {
$contents($content->post_name) = $content;
}
// Affichage d'un contenu :
// Admettons que le slug d'un de ces contenus soit "presentation",
// l'affichage de celui se fait comme ceci :
echo $contents['presentation']->post_content;
OU
// si le contenu contient des shortcodes
echo apply_filters('the_content', $contents['presentation']->post_content);
?>
Exemple 4 :
Sur le même principe que dans l’exemple 3, il est possible de filtrer, pour chaque affichage d’une page, les images correspondant à celle-ci.
<?php
$q = new WP_Query([
'post_type' => 'attachment',
'post_mime_type' =>'image',
'meta_key' => 'page',
'meta_value' => 'homepage',
'posts_per_page' => -1
]);
$imgs = [];
foreach ($q->posts as $img) {
$imgs[$img->post_name] = $img;
}
// Affichage de l'image :
// Admettons que le slug d'une de ces images soit "img-presentation",
// l'affichage de celle se fait comme ceci :
echo wp_get_attachment_image($imgs['img-presentation']->ID, 'full', false, []);
?>
Rqe:
Pour les images, les champs personnalisés doivent être définis dans le fichier functions.php.
<?php
// Ici, nous ajoutons la meta_key "page"
function sitetheme_media_meta_key( $form_fields, $post) {
$form_fields['page'] = array(
'value' => get_post_meta($post->ID, 'page', true) ? get_post_meta($post->ID, 'page', true) : '',
'label' => __('page')
);
return $form_fields;
}
add_filter('attachment_fields_to_edit', 'sitetheme_media_meta_key', 10, 2);
function sitetheme_edit_attachment($id) {
if (isset($_REQUEST['attachments'][$id]['page'])) {
$page = $_REQUEST['attachments'][$id]['page'];
// Sauvegarde de la meta_key dans la table wp_postmeta de la bdd
update_post_meta($id, 'page', $page);
}
}
add_action('edit_attachment', 'sitetheme_edit_attachment');
?>