Siirry sisältöön
🛠 Kuinka lisätä yksi mukautettu kenttä useisiin WordPress-julkaisuihin

🛠 Kuinka lisätä yksi mukautettu kenttä useisiin WordPress-julkaisuihin

Sivusto WordPress-alustalla on kasvanut satoihin artikkeleihin, ja jokaiseen niistä pitää lisätä uusi mukautettu kenttä. Jokaisen artikkelin avaaminen käsin ja "Päivitä"-painikkeen klikkaus on vähintään puolen päivän homma.

Varsinkin, jos hienosäädät teemaa tai yhdistät SEO-lisäosaa, joka tarvitsee saman meta_key-avaimen koko artikkeliarkistoon. WordPressin hallintapaneelissa ei ole "käytä kaikkiin" -painiketta, mutta se antaa kaksi tapaa ratkaista tämä koodilla.

Alla molemmat menetelmät valmiine koodinpätkineen: nopea (yksi SQL-kysely koko erälle) ja yksinkertainen (silmukka ID:iden yli käyttäen natiivia add_post_meta-funktiota). Valitse tehtävän mukaan.

Kaksi näyttöä näyttää erilaisia lähdekoodin ja kehitystiedostojen lohkoja kehittäjän työpisteellä

💡 Pikaopas:

  • Voit lisätä saman mukautetun kentän kaikkiin artikkeleihin kerralla käyttämällä add_post_meta-funktiota silmukassa, 4 riviä koodia.
  • Jos artikkeleita on satoja ja nopeudella on väliä, tee yksi suora INSERT wp_postmeta-tauluun mukautetun funktion avulla.
  • Molemmat menetelmät toimivat teeman functions.php-tiedoston tai Code Snippets -lisäosan kautta. Varmuuskopioi tietokanta ennen minkään SQL:n ajamista.

Miksi lisätä yksi kenttä moneen artikkeliin kerralla

Mukautetut kentät (tunnetaan myös nimellä post meta) tallentavat lisätietoa tietueesta: katselukerrat, sisäisen suodatuksen tunnisteet, "suosikki"-lipun, liittyvän tuotteen ID:n. Kaikkea, mikä ei mahdu vakio post_title- ja post_content-kenttiin.

Yleensä kenttä lisätään tapauskohtaisesti: avaa artikkeli, etsi editorista "Mukautetut kentät" -lohko, syötä avain-arvo-pari. Mutta kun kentän pitää ilmestyä kaikkiin 200 artikkeliin kerralla, manuaalinen tapa on poissuljettu.

Tyypillisiä skenaarioita, joissa massalisäystä tarvitaan:

  • Aktivoit lapsiteeman, joka käyttää get_post_meta($post_id, 'featured_post', true)-kutsua suosittujen artikkeleiden merkitsemiseen. Ilman massatäyttöä vanhat artikkelit eivät näy tulosteessa.
  • SEO-auditointi vaati noindex-asetuksen tietylle sisältötyypille meta-kentän kautta robots.txt-tiedoston sijaan.
  • Migraatio toiselta alustalta: vanhan CMS:n data päätyi CSV-tiedostoon, ja se pitää ladata wp_postmeta-tauluun tuhansille tietueille.

WordPressissä ei ole natiivia add_multiple_posts_meta-funktiota. Mutta on kaksi toimivaksi todettua polkua, valitse tilanteen mukaan.

Menetelmä 1. Yksi SQL-kysely kaikille artikkeleille

Nopein menetelmä, suora INSERT wp_postmeta-tauluun yhdessä transaktiossa. 200 yksittäisen tietokantakyselyn sijaan teet yhden, ja se suoritetaan millisekunneissa.

Alla add_multiple_posts_meta-funktio, joka ottaa vastaan taulukon artikkeli-ID:itä ja peilaa natiivin add_post_meta-funktion allekirjoitusta: samat parametrit, sama järjestys.

Lisää koodi lapsiteeman functions.php-tiedostoon tai Code Snippets -lisäosan kautta. Funktio itse tarkistaa, onko tällainen kenttä jo olemassa artikkelille (jos $unique = true on annettu) ja suodattaa pois virheelliset ID:t.

1if( !function_exists( 'add_multiple_posts_meta' ) ){
2 function add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique = false ){
3
4 // If key or ID is not set — exit
5 if( !$meta_key || empty( $post_ids ) ){
6 return false;
7 }
8
9 // One post — pass to native add_post_meta
10 if( is_numeric( $post_ids ) || ( is_array( $post_ids ) && count( $post_ids ) === 1 ) ){
11 return add_post_meta(
12 is_array( $post_ids ) ? $post_ids[0] : $post_ids,
13 $meta_key,
14 $meta_value,
15 $unique
16 );
17 }
18
19 global $wpdb;
20
21 // Filter out invalid IDs and duplicates
22 $valid_post_ids = array_unique(
23 array_filter( $post_ids, function( $post_id ) use ( $wpdb, $meta_key, $unique ){
24 return $post_id
25 && is_numeric( $post_id )
26 && get_post_status( $post_id )
27 && (
28 ! $unique
29 || ! $wpdb->get_var( $wpdb->prepare(
30 "SELECT COUNT(*) FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s",
31 $post_id,
32 $meta_key
33 ) )
34 );
35 } )
36 );
37
38 if( ! count( $valid_post_ids ) ){
39 return false;
40 }
41
42 // Sanitization
43 $meta_key = wp_unslash( $meta_key );
44 $meta_value = sanitize_meta( $meta_key, wp_unslash( $meta_value ), 'post' );
45
46 // Collect data and format strings for a single INSERT
47 $insert_data = [];
48 $insert_formats = [];
49
50 foreach( $valid_post_ids as $post_id ){
51 array_push( $insert_data, $post_id, $meta_key, $meta_value );
52 $insert_formats[] = '(%d, %s, %s)';
53 }
54
55 $sql_string = "INSERT INTO $wpdb->postmeta (`post_id`, `meta_key`, `meta_value`) VALUES "
56 . implode( ', ', $insert_formats );
57
58 // ... unpacks the array into separate arguments for prepare
59 $sql_query = $wpdb->prepare( $sql_string, ...$insert_data );
60
61 return $wpdb->query( $sql_query );
62 }
63}

Mitä tässä tapahtuu rivi riviltä. !function_exists-tarkistus on suoja konflikteja vastaan: jos toinen lisäosa on jo esitellyt samannimisen funktion, ei tule kriittistä virhettä. is_numeric($post_ids)-lohko välittää yksittäisen ID:n natiiville add_post_meta-funktiolle, joten sama funktio toimii sekä yhdellä artikkelilla että taulukolla. array_filter-suodatin hylkää luonnosten, poistettujen tietueiden ja niiden ID:t, joille uniikki kenttä on jo olemassa. Sanitointi wp_unslash- ja sanitize_meta-funktioilla on pakollista: ilman sitä serialisoitu data ja erikoismerkit rikkovat kyselyn.

*Tärkeä huomio kohdasta ...$insert_data.* ... (splat)-operaattori purkaa taulukon litteäksi argumenttilistaksi. Ilman sitä $wpdb->prepare saisi yhden taulukkoargumentin (%d, %s, %s)-joukkojen sijaan, ja kysely epäonnistuisi paikkamerkkien määrän virheeseen. PHP 5.6+ (WordPress vaatii vähintään 7.0, joten olet turvassa).

Kuinka käyttää

Anna taulukko artikkeli-ID:itä, avain ja arvo tavallisena kutsuna. Neljäs parametri, uniikkiuden lippu: true ei lisää kenttää, jos se on jo olemassa artikkelille.

1$post_ids = [ 1, 2, 3, 42, 108 ];
2$meta_key = 'featured_priority';
3$meta_value = 'high';
4$unique = false; // will set for all, even if the field already existed
5
6add_multiple_posts_meta( $post_ids, $meta_key, $meta_value, $unique );

Tällainen kutsu on kätevä ajaa init-koukun kautta (kerran, sitten poista se) tai WP-CLI-työkalulla wp eval-file-komennolla. Suorituksen jälkeen muista poistaa koodi functions.php-tiedostosta, muuten funktio käynnistyy jokaisella sivulatauksella.

Menetelmä 2. Silmukka ID:iden yli add_post_meta-funktiolla

Jos et halua koskea suoraan SQL:ään, käytä natiivia add_post_meta-funktiota silmukassa. Koodi on neljä kertaa lyhyempi ja nojaa täysin WordPressin ytimeen.

1$post_ids = [ 1, 2, 3, 42, 108 ];
2$meta_key = 'featured_priority';
3$meta_value = 'high';
4$unique = false;
5
6foreach( $post_ids as $post_id ){
7 add_post_meta( $post_id, $meta_key, $meta_value, $unique );
8}

Silmukka iteroi taulukon yli ja kutsuu add_post_meta-funktiota jokaiselle ID:lle. Funktio itse tarkistaa tietueen olemassaolon, avaimen uniikkiuden (jos $unique = true on asetettu) ja datan oikeellisuuden; lisävalidointia ei tarvita.

Suorituskyky. Sadalla artikkelilla ero SQL-kyselyyn on huomaamaton. Mutta jos sinulla on 5 000 tietuetta, jokainen add_post_meta-kutsu tuottaa erillisen INSERT-kyselyn, plus sisäiset koukut (added_post_meta, update_post_meta_cache). Tällaisilla volyymeilla ensimmäinen menetelmä yhdellä kyselyllä on 10-20 kertaa nopeampi.

Kertaluontoisiin operaatioihin parille kymmenelle artikkelille käytä silmukkaa, älä monimutkaista asioita.

Menetelmien vertailu

Kriteeri

Menetelmä 1 (yksi SQL)

Menetelmä 2 (add_post_meta-silmukka)

Nopeus 5 000 artikkelilla

~0,2 s (1 kysely)

~3-6 s (5 000 kyselyä)

Koodin monimutkaisuus

~50 riviä validointeineen

4 riviä

Turvallisuus

Manuaalinen sanitointi tarvitaan

add_post_meta hoitaa kaiken

WordPress-koukut

Ei kutsuta

added_post_meta, update_post_meta_cache

Milloin valita

Massamigraatio, CSV-tuonti

Kertaluontoiset muokkaukset, alle sata artikkelia

Yleissääntö: jos artikkeleita on alle sata ja operaatio on kertaluontoinen, käytä silmukkaa. Jos kyseessä on säännöllinen synkronointi tai tuhansien tietueiden migraatio, vain suora kysely valmistellulla funktiolla.

⁉️🤔 Usein kysytyt kysymykset

Voinko lisätä kentän valikoivasti, vain tietyn kategorian artikkeleille?

Kyllä. Hae artikkeli-ID:t get_posts-funktiolla käyttäen 'category' => ID_рубрики-parametria ja välitä taulukko jompaankumpaan yllä olevista menetelmistä. Tuhansille artikkeleille lisää 'numberposts' => -1 ja 'fields' => 'ids'; kysely palauttaa vain ID-taulukon lataamatta objekteja.

Tässä on valmis esimerkki: $post_ids = get_posts( [ 'category' => 5, 'numberposts' => -1, 'fields' => 'ids', 'post_type' => 'post' ] );. Kutsu sitten add_multiple_posts_meta($post_ids, ...) tai silmukkaa add_post_meta-funktiolla.

Entä jos tarvitsen eri kenttäarvon eri artikkeleille?

Massalisäys ei toimi tässä. Rakenna assosiatiivinen taulukko [ ID_поста => значение ] ja iteroi se silmukassa add_post_meta- tai update_post_meta-funktiolla. Yksi arvo kaikille, SQL; eri arvot eri artikkeleille, vain silmukka.

Yli 50 artikkelille, joilla on uniikit arvot, käytä update_post_meta-funktiota add_post_meta-funktion sijaan: se ei luo duplikaatteja, jos kenttä on jo olemassa.

Onko turvallista kirjoittaa SQL-kyselyjä suoraan wp_postmeta-tauluun?

Se on turvallista kahdella ehdolla. Ensimmäinen: aja data aina $wpdb->prepare-funktion läpi; se suojaa erikoismerkeiltä ja estää SQL-injektiot. Toinen: tee täysi tietokantavarmuuskopio ennen ajamista. Yksi virheellinen UPDATE ilman WHERE-ehtoa, ja wp_postmeta tyhjenee kaikilta tietueilta.

Varmuuskopiointikomento WP-CLI:llä: wp db export backup-before-meta.sql. Palautus: wp db import backup-before-meta.sql.

Miten add_post_meta eroaa update_post_meta-funktiosta?

add_post_meta lisää uuden rivin wp_postmeta-tauluun, vaikka avain olisi jo olemassa artikkelille, mikä johtaa duplikaattiin. update_post_meta tarkistaa avaimen olemassaolon: jos se on olemassa, se päivittää arvon; jos ei, se luo sen. Massatäyttöön, jossa on yksi avain per artikkeli, add_post_meta $unique = true -lipulla tuottaa saman vaikutuksen.

Käytännössä: add_post_meta($id, 'views', 0, true) luo kentän kerran eikä koske siihen enää. update_post_meta($id, 'views', $count) ylikirjoittaa arvon jokaisella kutsulla.

Mihin minun pitäisi sijoittaa koodi, teemaan vai lisäosaan?

Kertaluontoisiin operaatioihin lapsiteeman functions.php-tiedostoon, ja poista välittömästi suorituksen jälkeen. Toistuviin tehtäviin paketoi se Must-Use-lisäosaksi (wp-content/mu-plugins/-kansio) tai lisää Code Snippetsiin "Suorita kerran" -lipulla. Koodi aktiivisessa teemassa ilman poistoa osuu tietokantaan jokaisella sivulatauksella; se on tarpeetonta kuormaa.

Mitä valita tehtävääsi

Käytäntö osoittaa: 9 tapauksesta 10:stä hoituu silmukalla add_post_meta-funktiolla. Se on neljä riviä koodia, natiivi funktio, eikä yllätyksiä.

Suora SQL-kysely on perusteltu kahdessa tilanteessa: massamigraatio (tuhansia artikkeleita, aika on arvokasta) ja säännöllinen synkronointi, jossa hallitset sanitoinnin syötteessä. Muussa tapauksessa älä monimutkaista asioita.

Mitä tehdä juuri nyt:

  • Jos sinun pitää lisätä kenttä ≤100 artikkeliin, kopioi silmukka toisesta menetelmästä, liitä ID:si ja aja se.
  • Jos artikkeleita on useita tuhansia, ota funktio ensimmäisestä menetelmästä, mutta testaa se ensin sivuston kopiolla.
  • Kaikissa skenaarioissa varmuuskopioi tietokanta ennen ajamista. Tämä ei ole varotoimi; se on sääntö.

Ja mitä menetelmää sinä yleensä käytät mukautettujen kenttien lisäämiseen: hallintapaneelin, koodin vai lisäosan, kuten ACF:n, kautta? Kirjoita kommentteihin, on mielenkiintoista vertailla lähestymistapoja.