✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

Lägg till anpassad länk till skärmen Alla inlägg baserat på inläggsmetadata

13

TL;DR: Den här artikeln beskriver koden som behövs för att lägga till en anpassad länk på skärmen Alla inlägg som använder en anpassad del av inläggsmetadata.

Obs: För några månader sedan skrev jag en artikel om hur man lägger till en anpassad vy på skärmen Alla inlägg. Den här artikeln är inte alla tillsammans, men inte alla tillsammans olika. Se det som en mer detaljerad och kanske för mer praktisk implementering av konceptet.


Anta att du har en standardinläggstyp eller en anpassad inläggstyp och du kommer helt enkelt att filtrera efter en rubrik som du definierar med hjälp av en mekanism som låter dig spara data i post_metadatatabellen.

Låt oss till exempel säga att du har ett inlägg och det som en bit metadata med:

  • a meta_keymed värdet avarticle_attribute
  • a meta_valuemed värdet avheadline

Och du vill använda denna information för att lägga till en ny rubriklänk som automatiskt filtrerar bort allt utom artiklar med den metadatan.

Så här gör du.

Anpassad länk på skärmen Alla inlägg

Innan du börjar är det värt att notera att det finns två sätt att ta itu med det här problemet:

  • Vi kan lägga till länken högst upp på sidan Alla inlägg först och sedan lägga till funktionaliteten för att filtrera data,
  • Eller så kan vi göra det tvärtom där vi lägger till backend-logiken först och sedan lägger till länken Alla inlägg .

Jag kommer att välja att börja med det andra alternativet. Det finns ingen anledning till att det måste göras på det här sättet. Det är min preferens.


Först måste jag haka i [pre_get_posts](https://developer.wordpress.org/reference/hooks/pre_get_posts/)kroken som tillhandahålls av WordPress. Jag kommer inte att använda några namnavgränsade klasser eller prefixfunktioner i det här exemplet (med tanke på att jag har täckt det innehållet tillräckligt på den här webbplatsen), men jag kommer att ha en demoplugin för detta länkad längst ner i inlägget.

Hur som helst, jag börjar med att lägga till en anonym funktion kopplad till den tidigare nämnda kroken:

add_action(
  'pre_get_posts',
  function (WP_Query $query) {

  }
);

Observera att den anonyma funktionen accepterar ett enda argument som är en referens till den aktuella instansen av WP_Querysom körs på sidan. Om du inte är bekant med den klassen rekommenderar jag att du läser någon av dessa artiklar eller sidan för utvecklarresurser .

I funktionen måste jag kontrollera om det finns en meta_valuei frågesträngen. Detta är lätt att göra tack vare [filter_input](https://www.php.net/manual/en/function.filter-input.php)funktionen som tillhandahålls av PHP.

add_action(
  'pre_get_posts',
  function (WP_Query $query) {
    $meta_value = 'headline';

    if (filter_input( INPUT_GET, 'meta_value') === $meta_value) {
      $query->set( 'meta_key', 'article_attribute' );
      $query->set( 'meta_value', $meta_value );
    }
  }
);

Denna krok kommer att titta för att se om headlinevärdet är nyckeln för meta_valuenyckeln i frågesträngen. Om så är fallet lägger den sedan till ett meta_keyoch meta_valuetill instansen WP_Querysom kommer att instruera WordPress att hämta alla inlägg med just den metadatan.


Efter det måste jag lägga till en länk högst upp på sidan Alla inlägg för att aktivera den här funktionen. För att göra detta använder jag [views_edit-posts](https://tommcfarlin.com/add-a-custom-view/)kroken. Den här funktionen accepterar en rad ankare som kommer att visas överst på sidan.

Jag hänvisar till dessa som $viewsså att det är vad funktionen kommer att acceptera när jag stoppar ut den:

add_action(
  'views_edit-post',
  function (array $views) {

    return $views;
  }
);

Observera att det är viktigt att returnera arrayen till WordPress så att den vet vad den ska rendera även om ingen ändring görs.

Först måste jag avgöra om jag för närvarande är på den anpassade sidan. Om så är fallet måste jag lägga till de rätta attributen till ankaret som lagts till högst upp på sidan:


$attributes = 'class=""';
if (filter_input(INPUT_GET, 'meta_value') === 'headline') {
  $attributes ='class="current aria-current="page"';
}

Efter det måste jag faktiskt lägga till rubrikvyn på sidan. Detta kommer att kräva användning av flera funktioner:

  • [array_push](https://www.php.net/manual/en/function.array-push.php)för att lägga till en ny länk till listan över$views
  • [sprintf](https://www.php.net/manual/en/function.sprintf.php)för att säkert lägga till en ny sträng
  • [add_query_arg](https://developer.wordpress.org/reference/functions/add_query_arg/)för att lägga till en uppsättning anpassade frågeargument till den aktuella sidan.

Nästa avsnitt av koden kommer att se ut så här:


array_push(
  $views,
  sprintf(
    '<a href="%1$s" %2$s>%3$s 
      <span class="count">(%4$s)</span>
     </a>
    ',
    add_query_arg([
      'post_type'   => 'post',
      'post_status' => 'all',
      'meta_value'  => 'headline',
    ], 'edit.php'),
    $attributes
    __('Headlines'),
    count(  );
);

Men jag är inte klar än. Observera specifikt att jag ringer ett samtal till [count](https://www.php.net/manual/en/function.count.php)i slutet av funktionen. Detta för att jag korrekt ska kunna visa antalet inlägg som har detta attribut.

Jag ska skriva två hjälpfunktioner för detta och sedan återkommer jag till sizeofsamtalet.


Här är en hjälpfunktion för att hitta antalet resultat som har det angivna meta_keyoch meta_valuesom vi har för den här typen av inlägg. Lägg märke till att jag använder [$wpdb](https://developer.wordpress.org/reference/classes/wpdb/)för att göra ett direkt databassamtal och att jag specifikt använder [prepare](https://developer.wordpress.org/reference%2Fclasses%2Fwpdb%2Fprepare%2F/)det för att se till att jag gör det säkert.

function get_headline_results(): array {
  global $wpdb;
  return $wpdb->get_results( 
    $wpdb->prepare(
      "
      SELECT post_id FROM $wpdb->postmeta
      WHERE meta_key = %s AND meta_value = %s
      ",
      'article_attribute',
      'headline'
    ),
    ARRAY_A
  );
}

Observera att det returnerar alla resultat (inte bara siffran) eftersom detta värde kommer att överföras till en annan funktion tillfälligt.

Vid det här laget kan vi stanna och helt enkelt titta på innehållet som returneras från frågan, men om vi bara är oroliga för postinläggstypen måste vi ta hänsyn till det. Här är ett sätt att göra det:

function filter_posts_from_pages( array $results ): array {
  $post_ids = array();

  foreach ($results as $result) {
    if ('post' === get_post_type( $result['post_type'])) {
      $post_ids[] = $result['post_id'];
    }
  }

  return $post_ids;
}

Med det kan vi returnera detta värde tillbaka till countfunktionen ovan.


Den slutliga versionen av blocket som vi startade ovan bör se ut ungefär så här:


array_push(
  $views,
  sprintf(
    '<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
    add_query_arg(
      array(
        'post_type'   => 'post',
        'post_status' => 'all',
        'meta_value'  => 'headlines', 
      ),
      'edit.php'
    ),
    $attributes,
    __( 'Headlines' ),
    count(
      filter_posts_from_pages( get_headline_results()) )) );

Vilket innebär att den fullständiga versionen av funktionen för att lägga till en ny rubrik ser ut ungefär så här:

add_action(
  'views_edit-post',
  function (array $views) {

    $attributes = 'class=""';
    if (filter_input( INPUT_GET, 'meta_value') === 'headline') {
      $attributes = 'class="current aria-current="page"';
    }

    array_push(
      $views,
      sprintf(
        '<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
        add_query_arg(
          array(
            'post_type'   => 'post',
            'post_status' => 'all',
            'meta_value'  => 'headline', 
          ),
          'edit.php'
        ),
        $attributes,
        __( 'Headlines' ),
        count(
          filter_posts_from_pages( get_headline_results()) )) );

    return $views;
  }
);

Och, som nämnts från början, är denna plugin inte namnavgränsad eller organiserad på ett sätt som jag normalt skriver kod. Istället är det tänkt att visa ett sätt att uppnå något snabbt – en prototyp av slag.

Så om du är intresserad av att se något sådant här i aktion, kan du kolla in arkivet på GitHub. Lägg märke till att det är utvecklingsgrenen för tillfället. Kom ihåg att titta på [README](https://github.com/tommcfarlin/custom-metadata-filter/blob/develop/README.md)eftersom det kommer att ge instruktioner om hur du lägger till data till databasen för inlägg så att rubrikankaret faktiskt fungerar snarare än att villkorslöst visar ett nollvärde.

Inspelningskälla: tommcfarlin.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer