{"id":232246,"date":"2023-01-06T12:06:00","date_gmt":"2023-01-06T09:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232246"},"modified":"2023-01-06T13:03:26","modified_gmt":"2023-01-06T10:03:26","slug":"aggiungi-collegamento-personalizzato-alla-schermata-di-tutti-i-post-in-base-ai-metadati-dei-post","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/aggiungi-collegamento-personalizzato-alla-schermata-di-tutti-i-post-in-base-ai-metadati-dei-post\/","title":{"rendered":"Aggiungi collegamento personalizzato alla schermata di tutti i post in base ai metadati dei post"},"content":{"rendered":"\n<p><strong>TL; DR<\/strong>: questo articolo delinea il codice necessario per aggiungere un collegamento personalizzato nella schermata <strong>Tutti i post<\/strong> che utilizza un pezzo personalizzato di metadati del post.<\/p>\n<p><strong>Nota<\/strong>: alcuni mesi fa, ho scritto un articolo su <a href=\"https:\/\/wordpress.mediadoma.com\/it\/aggiungi-una-visualizzazione-personalizzata-alla-schermata-tutti-i-post\/\" title=\"come aggiungere una visualizzazione personalizzata alla schermata Tutti i post\">come aggiungere una visualizzazione personalizzata alla schermata Tutti i post<\/a>. Questo articolo non \u00e8 tutto insieme uguale, ma non tutto insieme diverso. Pensalo come un&#8217;implementazione pi\u00f9 dettagliata e forse pi\u00f9 pratica del concetto.<\/p>\n<hr \/>\n<p>Si supponga di avere un tipo di post standard o un tipo di post personalizzato e si filtrer\u00e0 semplicemente in base a un titolo che si definisce utilizzando un meccanismo che consente di salvare i dati nella <code>post_metadata<\/code>tabella.<\/p>\n<p>Ad esempio, supponiamo che tu abbia un post e questo come un pezzo di metadati con:<\/p>\n<ul>\n<li>a <code>meta_key<\/code>con il valore di<code>article_attribute<\/code><\/li>\n<li>a <code>meta_value<\/code>con il valore di<code>headline<\/code><\/li>\n<\/ul>\n<p>E desideri utilizzare queste informazioni per aggiungere un nuovo collegamento <strong>Titoli<\/strong> che filtra automaticamente tutto tranne gli articoli con tali metadati.<\/p>\n<p>Ecco come farlo.<\/p>\n<h2>Link personalizzato nella schermata di tutti i post<\/h2>\n<p>Prima di iniziare, vale la pena notare che ci sono due modi per affrontare questo problema:<\/p>\n<ul>\n<li>Potremmo aggiungere prima il collegamento nella parte superiore della pagina <strong>Tutti i post<\/strong> e quindi aggiungere la funzionalit\u00e0 per filtrare i dati in secondo luogo,<\/li>\n<li>Oppure possiamo farlo al contrario, aggiungendo prima la logica di back-end, quindi aggiungiamo il collegamento alla pagina <strong>Tutti i post .<\/strong><\/li>\n<\/ul>\n<p>Ho intenzione di scegliere di iniziare con la seconda opzione. Non c&#8217;\u00e8 motivo per cui debba essere fatto in questo modo. \u00c8 la mia preferenza.<\/p>\n<hr \/>\n<p>Innanzitutto, devo collegarmi <code>[pre_get_posts](https:\/\/developer.wordpress.org\/reference\/hooks\/pre_get_posts\/)<\/code>all&#8217;hook fornito da WordPress. Non utilizzer\u00f2 classi con spazi dei nomi o funzioni prefissate in questo esempio (dato che ho trattato abbastanza quel contenuto su questo sito), ma avr\u00f2 un plug-in demo per questo collegato in fondo al post.<\/p>\n<p>Ad ogni modo, inizier\u00f2 aggiungendo una funzione anonima allegata al suddetto hook:<\/p>\n<pre><code>add_action(\n  'pre_get_posts',\n  function (WP_Query $query) {\n\n  }\n);<\/code><\/pre>\n<p>Si noti che la funzione anonima accetta un singolo argomento che \u00e8 un riferimento all&#8217;istanza corrente <code>WP_Query<\/code>in esecuzione sulla pagina. Se non hai familiarit\u00e0 con quella classe, ti consiglio di leggere uno di <a href=\"https:\/\/tommcfarlin.com\/?s=wp_query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">questi articoli<\/a> o la pagina <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Risorse per gli sviluppatori<\/a>.<\/p>\n<p>Nella funzione, devo verificare la presenza di a <code>meta_value<\/code>nella stringa di query. Questo \u00e8 facile grazie alla <code>[filter_input](https:\/\/www.php.net\/manual\/en\/function.filter-input.php)<\/code>funzione fornita da 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>Questo hook cercher\u00e0 di vedere se il <code>headline<\/code>valore \u00e8 chiave per la <code>meta_value<\/code>chiave nella stringa di query. In tal caso, aggiunge una <code>meta_key<\/code>e <code>meta_value<\/code>alla cui istanza <code>WP_Query<\/code>indicher\u00e0 a WordPress di recuperare tutti i post con solo quei metadati.<\/p>\n<hr \/>\n<p>Dopodich\u00e9 devo aggiungere un collegamento nella parte superiore della pagina <strong>Tutti i post<\/strong> per attivare questa funzionalit\u00e0. Per fare questo, sfrutter\u00f2 il <code>[views_edit-posts](https:\/\/tommcfarlin.com\/add-a-custom-view\/)<\/code>gancio. Questa funzione accetter\u00e0 un array di ancoraggi che verranno visualizzati nella parte superiore della pagina.<\/p>\n<p>Mi riferisco a questi come <code>$views<\/code>questo \u00e8 ci\u00f2 che la funzione accetter\u00e0 quando lo spezzer\u00f2:<\/p>\n<pre><code>add_action(\n  'views_edit-post',\n  function (array $views) {\n\n    return $views;\n  }\n);<\/code><\/pre>\n<p>Nota che \u00e8 importante restituire l&#8217;array a WordPress in modo che sappia cosa eseguire il rendering anche se non viene apportata alcuna modifica.<\/p>\n<p>Innanzitutto, devo determinare se sono attualmente sulla pagina personalizzata. In tal caso, devo aggiungere gli attributi appropriati all&#8217;ancora aggiunta nella parte superiore della pagina:<\/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>Dopodich\u00e9, devo effettivamente aggiungere la vista <strong>Titoli<\/strong> alla pagina. Ci\u00f2 richieder\u00e0 l&#8217;uso di diverse funzioni:<\/p>\n<ul>\n<li><code>[array_push](https:\/\/www.php.net\/manual\/en\/function.array-push.php)<\/code>per aggiungere un nuovo collegamento all&#8217;elenco di<code>$views<\/code><\/li>\n<li><code>[sprintf](https:\/\/www.php.net\/manual\/en\/function.sprintf.php)<\/code>per aggiungere in modo sicuro una nuova stringa<\/li>\n<li><code>[add_query_arg](https:\/\/developer.wordpress.org\/reference\/functions\/add_query_arg\/)<\/code>per aggiungere un set di argomenti di query personalizzati alla pagina corrente.<\/li>\n<\/ul>\n<p>La prossima sezione di codice sar\u00e0 simile a questa:<\/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>Ma non ho ancora finito. Si noti in particolare che sto effettuando una chiamata alla <code>[count](https:\/\/www.php.net\/manual\/en\/function.count.php)<\/code>fine della funzione. Questo \u00e8 cos\u00ec che posso visualizzare correttamente il numero di post che hanno questo attributo.<\/p>\n<p>Scriver\u00f2 due funzioni di supporto per questo, quindi torner\u00f2 alla <code>sizeof<\/code>chiamata.<\/p>\n<hr \/>\n<p>Ecco una funzione di supporto per trovare il numero di risultati che hanno specificato <code>meta_key<\/code>e <code>meta_value<\/code>che abbiamo per questo tipo di post. Si noti che lo sto utilizzando <code>[$wpdb](https:\/\/developer.wordpress.org\/reference\/classes\/wpdb\/)<\/code>per effettuare una chiamata diretta al database e che lo sto utilizzando specificamente <code>[prepare](https:\/\/developer.wordpress.org\/reference%2Fclasses%2Fwpdb%2Fprepare%2F\/)<\/code>per assicurarmi di farlo in modo sicuro.<\/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>Si noti che restituisce tutti i risultati (non solo il numero) perch\u00e9 questo valore verr\u00e0 passato momentaneamente a un&#8217;altra funzione.<\/p>\n<p>A questo punto, potremmo fermarci e guardare semplicemente il contenuto che viene restituito dalla query, ma se siamo solo interessati al <code>post<\/code>tipo di post, allora dovremo tenerne conto. Ecco un modo per farlo:<\/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>Con ci\u00f2, possiamo restituire questo valore alla <code>count<\/code>funzione sopra.<\/p>\n<hr \/>\n<p>La versione finale del blocco che abbiamo iniziato sopra dovrebbe assomigliare a questa:<\/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>Ci\u00f2 significa che la versione completa della funzione per aggiungere un nuovo titolo \u00e8 simile a questa:<\/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>E, come accennato dall&#8217;inizio, questo plugin non ha uno spazio dei nomi o organizzato in un modo in cui normalmente scrivo il codice. Invece, ha lo scopo di dimostrare un modo per ottenere qualcosa rapidamente: una sorta di prototipo.<\/p>\n<p>Quindi, se sei interessato a vedere qualcosa del genere in azione, puoi controllare il repository su GitHub. Si noti che al momento \u00e8 il ramo di <strong><a href=\"https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/tree\/develop\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sviluppo .<\/a><\/strong> Ricorda di visualizzare il <code>[README](https:\/\/github.com\/tommcfarlin\/custom-metadata-filter\/blob\/develop\/README.md)<\/code>dato che fornir\u00e0 istruzioni su come aggiungere dati al database per i post in modo che l&#8217; ancora dei <strong>titoli<\/strong> funzioni effettivamente piuttosto che mostrare incondizionatamente un valore zero.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Questo articolo descrive il codice necessario per aggiungere un collegamento personalizzato nella schermata Tutti i post che utilizza un pezzo personalizzato di metadati del post.<\/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":[918,896,835,804,720,844,865],"tags":[1168],"class_list":["post-232246","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-altro","category-codice","category-guida-per-principianti","category-php-6","category-sviluppatore","category-tutorial","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=232246"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/232246\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/158583"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=232246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=232246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=232246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}