{"id":231952,"date":"2023-01-06T11:30:00","date_gmt":"2023-01-06T08:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231952"},"modified":"2023-01-06T12:48:41","modified_gmt":"2023-01-06T09:48:41","slug":"ajouter-un-lien-personnalise-a-lecran-de-toutes-les-publications-en-fonction-des-metadonnees-de-la-publication","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/ajouter-un-lien-personnalise-a-lecran-de-toutes-les-publications-en-fonction-des-metadonnees-de-la-publication\/","title":{"rendered":"Ajouter un lien personnalis\u00e9 \u00e0 l&rsquo;\u00e9cran de toutes les publications en fonction des m\u00e9tadonn\u00e9es de la publication"},"content":{"rendered":"\n<p><strong>TL; DR<\/strong>: Cet article d\u00e9crit le code n\u00e9cessaire pour ajouter un lien personnalis\u00e9 sur l&rsquo; \u00e9cran <strong>Tous les messages<\/strong> qui utilise un \u00e9l\u00e9ment personnalis\u00e9 de m\u00e9tadonn\u00e9es de publication.<\/p>\n<p><strong>Remarque<\/strong>: Il y a quelques mois, j&rsquo;ai \u00e9crit un article expliquant <a href=\"https:\/\/wordpress.mediadoma.com\/fr\/ajouter-une-vue-personnalisee-a-lecran-tous-les-messages\/\" title=\"comment ajouter une vue personnalis\u00e9e \u00e0 l'\u00e9cran Tous les messages\">comment ajouter une vue personnalis\u00e9e \u00e0 l&rsquo;\u00e9cran Tous les messages<\/a>. Cet article n&rsquo;est pas tous ensemble le m\u00eame, mais pas tous ensemble diff\u00e9rents. Consid\u00e9rez-le comme une mise en \u0153uvre plus d\u00e9taill\u00e9e et peut-\u00eatre plus pratique du concept.<\/p>\n<hr \/>\n<p>Supposons que vous ayez un type de publication standard ou un type de publication personnalis\u00e9 et que vous allez simplement filtrer par un titre que vous d\u00e9finissez \u00e0 l&rsquo;aide d&rsquo;un m\u00e9canisme qui vous permet d&rsquo;enregistrer des donn\u00e9es dans le <code>post_metadata<\/code>tableau.<\/p>\n<p>Par exemple, disons que vous avez un article et qu&rsquo;il s&rsquo;agit d&rsquo;un \u00e9l\u00e9ment de m\u00e9tadonn\u00e9es avec\u00a0:<\/p>\n<ul>\n<li>a <code>meta_key<\/code>avec la valeur de<code>article_attribute<\/code><\/li>\n<li>a <code>meta_value<\/code>avec la valeur de<code>headline<\/code><\/li>\n<\/ul>\n<p>Et vous souhaitez utiliser ces informations pour ajouter un nouveau lien <strong>Titres<\/strong> qui filtre automatiquement tout sauf les articles avec ces m\u00e9tadonn\u00e9es.<\/p>\n<p>Voici comment proc\u00e9der.<\/p>\n<h2>Lien personnalis\u00e9 sur l&rsquo;\u00e9cran de tous les messages<\/h2>\n<p>Avant de commencer, il convient de noter qu&rsquo;il existe deux fa\u00e7ons de r\u00e9soudre ce probl\u00e8me\u00a0:<\/p>\n<ul>\n<li>Nous pourrions d&rsquo;abord ajouter le lien en haut de la page <strong>Tous les messages<\/strong>, puis ajouter la fonctionnalit\u00e9 de filtrage des donn\u00e9es en second lieu,<\/li>\n<li>Ou nous pouvons le faire dans l&rsquo;autre sens en ajoutant d&rsquo;abord la logique principale, puis en ajoutant le lien de la page <strong>Tous les messages .<\/strong><\/li>\n<\/ul>\n<p>Je vais choisir de commencer par la deuxi\u00e8me option. Il n&rsquo;y a aucune raison pour que cela soit fait de cette fa\u00e7on. C&rsquo;est ma pr\u00e9f\u00e9rence.<\/p>\n<hr \/>\n<p>Tout d&rsquo;abord, je dois me connecter au <code>[pre_get_posts](https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/)<\/code>crochet fourni par WordPress. Je ne vais pas utiliser de classes d&rsquo;espace de noms ou de fonctions pr\u00e9fix\u00e9es dans cet exemple (\u00e9tant donn\u00e9 que j&rsquo;ai suffisamment couvert ce contenu sur ce site), mais j&rsquo;aurai un plug-in de d\u00e9monstration pour ce lien au bas de l&rsquo;article.<\/p>\n<p>Quoi qu&rsquo;il en soit, je commencerai par ajouter une fonction anonyme attach\u00e9e au crochet susmentionn\u00e9\u00a0:<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n\n  }\n);<\/code><\/pre>\n<p>Notez que la fonction anonyme accepte un seul argument qui est une r\u00e9f\u00e9rence \u00e0 l&rsquo;instance actuelle de <code>WP_Query<\/code>qui s&rsquo;ex\u00e9cute sur la page. Si vous n&rsquo;\u00eates pas familier avec cette classe, je vous recommande de lire l&rsquo;un de <a href=\"https:\/\/tommcfarlin.com\/?s=wp_query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ces articles<\/a> ou la page des <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressources pour les d\u00e9veloppeurs<\/a>.<\/p>\n<p>Dans la fonction, je dois v\u00e9rifier la pr\u00e9sence de a <code>meta_value<\/code>dans la cha\u00eene de requ\u00eate. C&rsquo;est facile \u00e0 faire gr\u00e2ce \u00e0 la <code>[filter_input](https:\/\/www.php.net\/manual\/en\/function.filter-input.php)<\/code>fonction fournie par PHP.<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n    $meta_value = 'headline';\n\n    if (filter_input( INPUT_GET, 'meta_value') === $meta_value) {\n      $query-&gt;set( 'meta_key', 'article_attribute' );\n      $query-&gt;set( 'meta_value', $meta_value );\n    }\n  }\n);<\/code><\/pre>\n<p>Ce crochet cherchera \u00e0 voir si la <code>headline<\/code>valeur est cl\u00e9 pour la <code>meta_value<\/code>cl\u00e9 dans la cha\u00eene de requ\u00eate. Si c&rsquo;est le cas, il ajoute ensuite un <code>meta_key<\/code>et <code>meta_value<\/code>\u00e0 l&rsquo;instance <code>WP_Query<\/code>qui demandera \u00e0 WordPress de r\u00e9cup\u00e9rer tous les messages avec uniquement ces m\u00e9tadonn\u00e9es.<\/p>\n<hr \/>\n<p>Apr\u00e8s cela, je dois ajouter un lien en haut de la page <strong>Tous les messages<\/strong> pour d\u00e9clencher cette fonctionnalit\u00e9. Pour ce faire, je vais tirer parti du <code>[views_edit-posts](https:\/\/tommcfarlin.com\/add-a-custom-view\/)<\/code>crochet. Cette fonction acceptera un tableau d&rsquo;ancres qui seront affich\u00e9es en haut de la page.<\/p>\n<p>Je me r\u00e9f\u00e8re \u00e0 ceux-ci comme <code>$views<\/code>c&rsquo;est ce que la fonction acceptera quand je le supprimerai:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Notez qu&rsquo;il est important de renvoyer le tableau \u00e0 WordPress afin qu&rsquo;il sache quoi rendre m\u00eame si aucune modification n&rsquo;est apport\u00e9e.<\/p>\n<p>Tout d&rsquo;abord, je dois d\u00e9terminer si je suis actuellement sur la page personnalis\u00e9e. Si tel est le cas, je dois ajouter les attributs appropri\u00e9s \u00e0 l&rsquo;ancre ajout\u00e9e en haut de la page\u00a0:<\/p>\n<pre><code>\n$attributes = 'class=\"\"';\nif (filter_input(INPUT_GET, 'meta_value') === 'headline') {\n  $attributes ='class=\"current aria-current=\"page\"';\n}<\/code><\/pre>\n<p>Apr\u00e8s cela, je dois ajouter la vue <strong>Titres<\/strong> \u00e0 la page. Cela n\u00e9cessitera l&rsquo;utilisation de plusieurs fonctions :<\/p>\n<ul>\n<li><code>[array_push](https:\/\/www.php.net\/manual\/en\/function.array-push.php)<\/code>pour ajouter un nouveau lien \u00e0 la liste des<code>$views<\/code><\/li>\n<li><code>[sprintf](https:\/\/www.php.net\/manual\/en\/function.sprintf.php)<\/code>pour ajouter en toute s\u00e9curit\u00e9 une nouvelle cha\u00eene<\/li>\n<li><code>[add_query_arg](https:\/\/developer.wordpress.org\/reference\/functions\/add_query_arg\/)<\/code>pour ajouter un ensemble d&rsquo;arguments de requ\u00eate personnalis\u00e9s \u00e0 la page actuelle.<\/li>\n<\/ul>\n<p>La prochaine section de code ressemblera \u00e0 ceci\u00a0:<\/p>\n<pre><code>\narray_push(\n  $views,\n  sprintf(\n    '&lt;a href=\"%1$s\" %2$s&gt;%3$s \n      &lt;span class=\"count\"&gt;(%4$s)&lt;\/span&gt;\n     &lt;\/a&gt;\n    ',\n    add_query_arg([\n      'post_type'   =&gt; 'post',\n      'post_status' =&gt; 'all',\n      'meta_value'  =&gt; 'headline',\n    ], 'edit.php'),\n    $attributes\n    __('Headlines'),\n    count(  );\n);<\/code><\/pre>\n<p>Mais je n&rsquo;ai pas encore fini. Notez sp\u00e9cifiquement que je fais un appel \u00e0 <code>[count](https:\/\/www.php.net\/manual\/en\/function.count.php)<\/code>\u00e0 la fin de la fonction. C&rsquo;est pour que je puisse afficher correctement le nombre de messages qui ont cet attribut.<\/p>\n<p>Je vais \u00e9crire deux fonctions d&rsquo;assistance pour cela, puis je reviendrai \u00e0 l&rsquo; <code>sizeof<\/code>appel.<\/p>\n<hr \/>\n<p>Voici une fonction d&rsquo;assistance pour trouver le nombre de r\u00e9sultats qui ont le sp\u00e9cifi\u00e9 <code>meta_key<\/code>et <code>meta_value<\/code>que nous avons pour ce type de publication. Notez que j&rsquo;utilise <code>[$wpdb](https:\/\/developer.wordpress.org\/reference\/classes\/wpdb\/)<\/code>pour effectuer un appel direct \u00e0 la base de donn\u00e9es et que j&rsquo;utilise sp\u00e9cifiquement <code>[prepare](https:\/\/developer.wordpress.org\/reference%2Fclasses%2Fwpdb%2Fprepare%2F\/)<\/code>pour m&rsquo;assurer de le faire en toute s\u00e9curit\u00e9.<\/p>\n<pre><code>function get_headline_results(): array {\n  global $wpdb;\n  return $wpdb-&gt;get_results( \n    $wpdb-&gt;prepare(\n      \"\n      SELECT post_id FROM $wpdb-&gt;postmeta\n      WHERE meta_key = %s AND meta_value = %s\n      \",\n      'article_attribute',\n      'headline'\n    ),\n    ARRAY_A\n  );\n}<\/code><\/pre>\n<p>Notez qu&rsquo;il renvoie tous les r\u00e9sultats (pas seulement le nombre) car cette valeur sera momentan\u00e9ment pass\u00e9e \u00e0 une autre fonction.<\/p>\n<p>\u00c0 ce stade, nous pourrions nous arr\u00eater et simplement regarder le contenu renvoy\u00e9 par la requ\u00eate, mais si nous ne nous pr\u00e9occupons que du <code>post<\/code>type de publication, nous devrons en tenir compte. Voici une fa\u00e7on de proc\u00e9der\u00a0:<\/p>\n<pre><code>function filter_posts_from_pages( array $results ): array {\n  $post_ids = array();\n\n  foreach ($results as $result) {\n    if ('post' === get_post_type( $result['post_type'])) {\n      $post_ids[] = $result['post_id'];\n    }\n  }\n\n  return $post_ids;\n}<\/code><\/pre>\n<p>Avec cela, nous pouvons renvoyer cette valeur \u00e0 la <code>count<\/code>fonction ci-dessus.<\/p>\n<hr \/>\n<p>La version finale du bloc que nous avons commenc\u00e9 ci-dessus devrait ressembler \u00e0 ceci\u00a0:<\/p>\n<pre><code>\narray_push(\n  $views,\n  sprintf(\n    '&lt;a href=\"%1$s\" %2$s&gt;%3$s &lt;span class=\"count\"&gt;(%4$s)&lt;\/span&gt;&lt;\/a&gt;',\n    add_query_arg(\n      array(\n        'post_type'   =&gt; 'post',\n        'post_status' =&gt; 'all',\n        'meta_value'  =&gt; 'headlines', \n      ),\n      'edit.php'\n    ),\n    $attributes,\n    __( 'Headlines' ),\n    count(\n      filter_posts_from_pages( get_headline_results()) )) );<\/code><\/pre>\n<p>Ce qui signifie que la version compl\u00e8te de la fonction pour ajouter un nouveau titre ressemble \u00e0 ceci\u00a0:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    $attributes = 'class=\"\"';\n    if (filter_input( INPUT_GET, 'meta_value') === 'headline') {\n      $attributes = 'class=\"current aria-current=\"page\"';\n    }\n\n    array_push(\n      $views,\n      sprintf(\n        '&lt;a href=\"%1$s\" %2$s&gt;%3$s &lt;span class=\"count\"&gt;(%4$s)&lt;\/span&gt;&lt;\/a&gt;',\n        add_query_arg(\n          array(\n            'post_type'   =&gt; 'post',\n            'post_status' =&gt; 'all',\n            'meta_value'  =&gt; 'headline', \n          ),\n          'edit.php'\n        ),\n        $attributes,\n        __( 'Headlines' ),\n        count(\n          filter_posts_from_pages( get_headline_results()) )) );\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Et, comme mentionn\u00e9 d\u00e8s le d\u00e9part, ce plugin n&rsquo;est pas nomm\u00e9 ou organis\u00e9 d&rsquo;une mani\u00e8re que j&rsquo;\u00e9cris normalement du code. Au lieu de cela, il est destin\u00e9 \u00e0 d\u00e9montrer un moyen de r\u00e9aliser quelque chose rapidement &#8211; une sorte de prototype.<\/p>\n<p>Donc, si vous souhaitez voir quelque chose comme \u00e7a en action, vous pouvez consulter le r\u00e9f\u00e9rentiel sur GitHub. Notez qu&rsquo;il s&rsquo;agit de la branche <strong><a href=\"https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">develop<\/a><\/strong> pour le moment. N&rsquo;oubliez pas de consulter le <code>[README](https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/blob\/develop\/README.md)<\/code>car il donnera des instructions sur la fa\u00e7on d&rsquo;ajouter des donn\u00e9es \u00e0 la base de donn\u00e9es pour les publications afin que l&rsquo; ancre <strong>Headlines<\/strong> fonctionne r\u00e9ellement plut\u00f4t que d&rsquo;afficher inconditionnellement une valeur nulle.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article d\u00e9crit le code n\u00e9cessaire pour ajouter un lien personnalis\u00e9 sur l&rsquo;\u00e9cran Toutes les publications qui utilise un \u00e9l\u00e9ment personnalis\u00e9 de m\u00e9tadonn\u00e9es de publication.<\/p>\n","protected":false},"author":1,"featured_media":158583,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,717,832,801,841,862],"tags":[1167],"class_list":["post-231952","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autre","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-php-3","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=231952"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231952\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/158583"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231952"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}