Liigu sisu juurde
🛠 Kuidas lisada ühte kohandatud välja paljudele WordPressi postitustele

🛠 Kuidas lisada ühte kohandatud välja paljudele WordPressi postitustele

Veebileht WordPressil on kasvanud sadade postitusteni ja igaühele neist on vaja lisada uus kohandatud väli. Iga postituse käsitsi avamine ja „Uuenda" klõpsamine on vähemalt poole päeva töö.

Eriti kui viimistled teemat või ühendad SEO-pluginat, mis vajab sama meta_key väärtust kogu postituste voos. WordPressi administraatori paneel ei paku „rakenda kõigile" nuppu, kuid see annab sulle kaks võimalust selle koodiga lahendamiseks.

Allpool on mõlemad meetodid koos kasutusvalmis koodijuppidega: kiire (üks SQL-päring kogu partiile) ja lihtne (silm üle ID-de, kasutades sisseehitatud add_post_meta funktsiooni). Vali ülesandest lähtuvalt.

Two monitors display various blocks of source code and development files on a developer's workspace

💡 Kiire ülevaade:

  • Saad määrata sama kohandatud välja kõigile postitustele hulgi, kasutades add_post_meta funktsiooni tsüklis, 4 rida koodi.
  • Kui postitusi on sadu ja kiirus on oluline, siis üks otse INSERT päring wp_postmeta tabelisse kohandatud funktsiooni kaudu.
  • Mõlemad meetodid töötavad teema functions.php faili või Code Snippets pluginat kasutades. Enne mis tahes SQL-i käivitamist varunda andmebaas.

Miks lisada üks väli paljudele postitustele korraga

Kohandatud väljad (tuntud ka kui post meta) salvestavad kirje kohta lisateavet: vaatamiste arv, sildid sisemiseks filtreerimiseks, „lemmiku" lipp, seotud toote ID. Kõike, mis ei mahu standardsete post_title ja post_content väljade sisse.

Tavaliselt lisatakse väli juhtumipõhiselt: ava postitus, leia redaktorist „Kohandatud väljad" plokk, sisesta võti-väärtus paar. Aga kui väli peab ilmuma kõigile 200 postitusele korraga, on käsitsi meetod välistatud.

Tüüpilised stsenaariumid, kus hulgitoiming on vajalik:

  • Sa aktiveerisid alamteema, mis kasutab get_post_meta($post_id, 'featured_post', true), et märkida populaarseid postitusi. Ilma hulgi täitmiseta ei ilmu vanad postitused väljundis.
  • SEO audit nõudis noindex määramist kindlale sisutüübile meta välja kaudu, mitte robots.txt kaudu.
  • Migratsioon teiselt platvormilt: vana CMS-i andmed maandusid CSV-faili ja need tuleb laadida wp_postmeta tabelisse tuhandete kirjete jaoks.

WordPressil ei ole sisseehitatud add_multiple_posts_meta funktsiooni. Kuid on kaks tõestatud teed, vali olukorrast lähtuvalt.

Meetod 1. Üks SQL-päring kõigile postitustele

Kiireim meetod, otse INSERT päring wp_postmeta tabelisse ühe tehinguna. 200 individuaalse andmebaasipäringu asemel teed ühe ja see käivitatakse millisekunditega.

Allpool on add_multiple_posts_meta funktsioon, mis võtab vastu postituste ID-de massiivi ja peegeldab sisseehitatud add_post_meta signatuuri: samad parameetrid, samas järjekorras.

Lisa kood alamteema functions.php faili või Code Snippets pluginat kasutades. Funktsioon ise kontrollib, kas selline väli on postituse jaoks juba olemas (kui $unique = true on edastatud) ja filtreerib välja kehtetud ID-d.

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}

Mis siin rida-realt toimub. !function_exists kontroll on kaitse konfliktide vastu: kui mõni teine plugin on juba deklareerinud sama nimega funktsiooni, siis ei teki fataalset viga. is_numeric($post_ids) plokk edastab üksiku ID sisseehitatud add_post_meta funktsioonile, nii et sama funktsioon töötab nii üksiku postituse kui ka massiiviga. array_filter filter eemaldab mustandite, kustutatud kirjete ja nende ID-d, mille jaoks unikaalne väli juba olemas on. Puhastamine wp_unslash ja sanitize_meta abil on kohustuslik: ilma selleta lõhuvad serialiseeritud andmed ja erimärgid päringu.

Oluline märkus ...$insert_data kohta. ... (splat) operaator pakib massiivi lahti lamedaks argumentide loendiks. Ilma selleta saaks $wpdb->prepare ühe massiivi argumendi, mitte komplekti (%d, %s, %s) ja päring ebaõnnestuks kohatäidete arvu veaga. PHP 5.6+ (WordPress nõuab minimaalselt 7.0, nii et oled kaitstud).

Kuidas kasutada

Edasta massiiv postituste ID-sid, võti ja väärtus tavalise väljakutsena. Neljas parameeter, unikaalsuse lipp: true ei lisa välja, kui see on postituse jaoks juba olemas.

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

Sellist väljakutset on mugav käivitada init konksu kaudu (üks kord, seejärel eemalda see) või WP-CLI abil käsuga wp eval-file. Pärast käivitamist eemalda kindlasti kood failist functions.php, vastasel juhul käivitub funktsioon igal lehe laadimisel.

Meetod 2. Silmus üle ID-de koos add_post_meta funktsiooniga

Kui sa ei soovi otse SQL-i puutuda, kasuta sisseehitatud add_post_meta funktsiooni tsüklis. Kood on neli korda lühem ja tugineb täielikult WordPressi tuumale.

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}

Silmus itereerib üle massiivi ja kutsub iga ID jaoks välja add_post_meta. Funktsioon ise kontrollib kirje olemasolu, võtme unikaalsust (kui $unique = true on seatud) ja andmete korrektsust; täiendavat valideerimist pole vaja.

Jõudlus. Saja postituse puhul on erinevus SQL-päringust märkamatu. Aga kui sul on 5000 kirjet, genereerib iga add_post_meta kutse eraldi INSERT-i, pluss sisemised konksud (added_post_meta, update_post_meta_cache). Selliste mahtude juures töötab esimene meetod ühe päringuga 10-20 korda kiiremini.

Ühekordsete operatsioonide puhul paarikümne postitusega kasuta tsüklit, ära aja asja keeruliseks.

Lähenemisviiside võrdlus

Kriteerium

Meetod 1 (üks SQL)

Meetod 2 (add_post_meta tsükkel)

Kiirus 5000 postitusega

~0,2 sek (1 päring)

~3-6 sek (5000 päringut)

Koodi keerukus

~50 rida koos valideerimisega

4 rida

Turvalisus

Vajalik käsitsi puhastamine

add_post_meta haldab kõike

WordPressi konksud

Ei kutsuta

added_post_meta, update_post_meta_cache

Millal valida

Hulgi migratsioon, CSV import

Ühekordsed muudatused, kuni sada postitust

Universaalne reegel: kui postitusi on vähem kui sada ja operatsioon on ühekordne, kasuta tsüklit. Kui see hõlmab regulaarset sünkroonimist või tuhandete kirjete migratsiooni, siis ainult otsepäring koos ettevalmistatud funktsiooniga.

⁉️🤔 Korduma kippuvad küsimused

Kas ma saan määrata välja valikuliselt, ainult kindla kategooria postitustele?

Jah. Hangi postituste ID-d get_posts abil koos 'category' => ID_рубрики parameetriga, seejärel edasta massiiv ühele kahest ülaltoodud meetodist. Tuhandete postituste jaoks lisa 'numberposts' => -1 ja 'fields' => 'ids'; päring tagastab ainult ID-de massiivi, ilma objekte laadimata.

Siin on valmis näide: $post_ids = get_posts( [ 'category' => 5, 'numberposts' => -1, 'fields' => 'ids', 'post_type' => 'post' ] );. Seejärel kutsu add_multiple_posts_meta($post_ids, ...) või tsükkel koos add_post_meta funktsiooniga.

Mis siis, kui vajan erinevatele postitustele erinevat välja väärtust?

Hulgi sisestamine siin ei tööta. Ehita assotsiatiivne massiiv [ ID_поста => значение ] ja itereeri selle üle tsüklis koos add_post_meta või update_post_meta funktsiooniga. Üks väärtus kõigile, SQL; erinevad väärtused erinevatele postitustele, ainult tsükkel.

50+ postituse jaoks unikaalsete väärtustega kasuta update_post_meta add_post_meta asemel: see ei tekita duplikaate, kui väli on juba olemas.

Kas on turvaline kirjutada SQL-päringuid otse wp_postmeta tabelisse?

See on turvaline kahel tingimusel. Esiteks: käivita andmed alati läbi $wpdb->prepare; see väldib erimärke ja blokeerib SQL süstimised. Teiseks: tee enne käivitamist täielik andmebaasi varukoopia. Üks vale UPDATE ilma WHERE'ita ja wp_postmeta tühjendatakse kõigi kirjete jaoks.

Varundamise käsk WP-CLI kaudu: wp db export backup-before-meta.sql. Taastamine: wp db import backup-before-meta.sql.

Kuidas add_post_meta erineb update_post_meta funktsioonist?

add_post_meta lisab uue rea wp_postmeta tabelisse, isegi kui võti on postituse jaoks juba olemas, mille tulemuseks on duplikaat. update_post_meta kontrollib võtme olemasolu: kui see on olemas, uuendab väärtust; kui mitte, loob selle. Hulgi täitmisel, kus iga postituse kohta on üks võti, annab add_post_meta koos $unique = true sama efekti.

Praktikas: add_post_meta($id, 'views', 0, true) loob välja ühe korra ega puutu seda enam kunagi. update_post_meta($id, 'views', $count) kirjutab väärtuse üle igal väljakutsel.

Kuhu peaksin koodi paigutama, teemasse või pluginasse?

Ühekordsete operatsioonide puhul alamteema functions.php faili, eemaldades selle kohe pärast käivitamist. Korduvate ülesannete jaoks pakenda see Must-Use pluginana (wp-content/mu-plugins/ kaust) või lisa Code Snippets'ile lipuga „Käivita üks kord". Kood aktiivses teemas ilma eemaldamiseta tabab andmebaasi igal lehe laadimisel; see on tarbetu koormus.

Mida oma ülesande jaoks valida

Praktika näitab: 9 juhtu 10-st on kaetud tsükliga koos add_post_meta funktsiooniga. See on neli rida koodi, sisseehitatud funktsioon ja ilma üllatusteta.

Otsene SQL-päring on õigustatud kahes olukorras: hulgi migratsioon (tuhanded postitused, aeg on väärtuslik) ja perioodiline sünkroonimine, kus kontrollid sisendi puhastamist. Vastasel juhul ära aja asja keeruliseks.

Mida kohe teha:

  • Kui pead määrama välja ≤100 postitusele, kopeeri tsükkel teisest meetodist, ühenda oma ID-d ja käivita see.
  • Kui postitusi on mitu tuhat, võta funktsioon esimesest meetodist, kuid testi seda kõigepealt saidi koopial.
  • Iga stsenaariumi korral varunda andmebaas enne käivitamist. See ei ole ettevaatusabinõu; see on reegel.

Ja millist meetodit kasutad tavaliselt sina kohandatud väljade lisamiseks: administraatori paneeli, koodi või pluginat nagu ACF? Kirjuta kommentaaridesse, on huvitav lähenemisviise võrrelda.