✅ WEB ja WordPressi uudised, teemad, pistikprogrammid. Siin jagame näpunäiteid ja parimaid veebisaidi lahendusi.

Lisage postituste metaandmete põhjal kohandatud link kõigi postituste ekraanile

10

TL;DR: selles artiklis kirjeldatakse koodi, mis on vajalik kohandatud lingi lisamiseks ekraanile Kõik postitused, mis kasutab kohandatud postituse metaandmeid.

Märkus: paar kuud tagasi kirjutasin artikli selle kohta, kuidas lisada kohandatud vaadet ekraanile Kõik postitused. See artikkel ei ole kõik koos sama, kuid mitte kõik koos erinevad. Mõelge sellele kui kontseptsiooni üksikasjalikumale ja võib-olla praktilisemale rakendamisele.


Oletagem, et teil on standardne postituse tüüp või kohandatud postituse tüüp ja te filtreerite lihtsalt pealkirja järgi, mille määrate mehhanismi abil, mis võimaldab teil post_metadatatabelisse andmeid salvestada.

Oletame näiteks, et teil on postitus ja see on metaandmete osa koos:

  • a meta_keyväärtusegaarticle_attribute
  • a meta_valueväärtusegaheadline

Ja soovite seda teavet kasutada uue pealkirjade lingi lisamiseks, mis filtreerib automaatselt välja kõik, välja arvatud nende metaandmetega artiklid.

Siin on, kuidas seda teha.

Kohandatud link kõigi postituste ekraanil

Enne alustamist tasub märkida, et selle probleemi lahendamiseks on kaks võimalust.

  • Võiksime esmalt lisada lingi lehe Kõik postitused ülaossa ja seejärel lisada andmete filtreerimise funktsiooni,
  • Või võime seda teha ka teistpidi, lisades esmalt taustaloogika ja seejärel lehe Kõik postitused lingi.

Ma otsustan alustada teise variandiga. Pole mingit põhjust, miks seda niimoodi tegema peab. See on minu eelistus.


Esiteks pean haakuma [pre_get_posts](https://developer.wordpress.org/reference/hooks/pre_get_posts/)WordPressi pakutava konksu külge. Ma ei kasuta selles näites ühtegi nimeruumiga klasse ega eesliitega funktsioone (arvestades, et olen sellel saidil seda sisu piisavalt käsitlenud), kuid selle jaoks on postituse allosas lingitud demoplugin.

Igatahes alustan sellest, et lisan eelmainitud konksu külge anonüümse funktsiooni:

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

  }
);

Pange tähele, et anonüümne funktsioon aktsepteerib ühe argumendi, mis on viide WP_Querylehel töötavale eksemplarile. Kui te pole selle klassiga tuttav, soovitan lugeda mõnda neist artiklitest või arendajaressursside lehte.

Funktsioonis pean kontrollima a olemasolu meta_valuepäringustringis. Seda on lihtne teha tänu [filter_input](https://www.php.net/manual/en/function.filter-input.php)PHP pakutavale funktsioonile.

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 );
    }
  }
);

See konks vaatab, kas headlineväärtus on meta_valuepäringustringis oleva võtme võti. Kui jah, lisab see eksemplarile ja, meta_keymis annab WordPressile korralduse tuua kõik postitused ainult nende metaandmetega.meta_value``WP_Query


Pärast seda pean selle funktsiooni käivitamiseks lisama lehe Kõik postitused ülaossa lingi. Selleks kasutan [views_edit-posts](https://tommcfarlin.com/add-a-custom-view/)konksu. See funktsioon aktsepteerib hulga ankruid, mis kuvatakse lehe ülaosas.

Nimetan neid $viewsnii, et funktsioon võtab selle vastu, kui ma selle välja lülitan:

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

    return $views;
  }
);

Pange tähele, et massiiv on oluline WordPressile tagasi saata, et see teaks, mida renderdada, isegi kui muudatusi ei tehta.

Esiteks pean kindlaks tegema, kas olen praegu kohandatud lehel. Kui jah, siis pean lehe ülaossa lisatud ankrule lisama õiged atribuudid:


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

Pärast seda pean tegelikult lehele lisama pealkirjade vaate. See nõuab mitme funktsiooni kasutamist:

  • [array_push](https://www.php.net/manual/en/function.array-push.php)uue lingi lisamiseks loendisse$views
  • [sprintf](https://www.php.net/manual/en/function.sprintf.php)uue stringi turvaliseks lisamiseks
  • [add_query_arg](https://developer.wordpress.org/reference/functions/add_query_arg/)kohandatud päringuargumentide komplekti lisamiseks praegusele lehele.

Järgmine koodiosa näeb välja selline:


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(  );
);

Aga ma pole veel lõpetanud. [count](https://www.php.net/manual/en/function.count.php)Pange tähele, et funktsiooni lõpus helistan numbrile. Seda selleks, et saaksin õigesti kuvada selle atribuudiga postituste arvu.

Kirjutan selle jaoks kaks abifunktsiooni ja siis pöördun tagasi sizeofkõne juurde.


Siin on abifunktsioon, mille abil saate leida tulemuste arvu, millel on määratud meta_keyja meta_valuemis meil seda tüüpi postituste jaoks on. Pange tähele, et ma kasutan [$wpdb](https://developer.wordpress.org/reference/classes/wpdb/)otse andmebaasikõne tegemiseks ja kasutan seda spetsiaalselt selleks [prepare](https://developer.wordpress.org/reference%2Fclasses%2Fwpdb%2Fprepare%2F/), et teha seda ohutult.

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
  );
}

Pange tähele, et see tagastab kõik tulemused (mitte ainult arvu), kuna see väärtus edastatakse hetkega teise funktsiooni.

Siinkohal võiksime peatuda ja lihtsalt vaadata päringust tagastatud sisu, kuid kui oleme mures ainult postpostituse tüübi pärast, siis peame sellega arvestama. Siin on üks viis seda teha.

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;
}

Sellega saame selle väärtuse tagasi countülaltoodud funktsioonile.


Eespool alustatud ploki lõplik versioon peaks välja nägema umbes selline:


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()) )) );

Mis tähendab, et uue pealkirja lisamise funktsiooni täielik versioon näeb välja umbes selline:

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;
  }
);

Ja nagu algusest peale mainitud, pole sellel pistikprogrammil nimeruumid ega korraldatud nii, nagu ma tavaliselt koodi kirjutan. Selle asemel on see mõeldud selleks, et demonstreerida viisi, kuidas midagi kiiresti saavutada – omamoodi prototüüpi.

Nii et kui soovite midagi sellist tegevuses näha, võite vaadata GitHubi hoidlat. Pange tähele, et see on hetkel arendusharu . Ärge unustage vaadata, [README](https://github.com/tommcfarlin/custom-metadata-filter/blob/develop/README.md)kuna see annab juhiseid postituste andmebaasi andmete lisamiseks, et pealkirjade ankur tegelikult töötaks, mitte ei näitaks tingimusteta nullväärtust.

See veebisait kasutab teie kasutuskogemuse parandamiseks küpsiseid. Eeldame, et olete sellega rahul, kuid saate soovi korral loobuda. Nõustu Loe rohkem