Uvod
WordPress Custom fields omogućavaju da krajnji korisnik unese neki specifični podatak a da ne koristi postojeće standardne meta box-ove (naslov posta i sadržaj posta). Custom Fields (srp. posebna polja) su zapravo meta podaci (eng.meta data) ali se nazivaju poljima jer izgledaju kao polja u wordpress administratorskom interfejsu.
Da bi meta-box “Custom Fields” bio dostupan pri editovanju posta neophodno je da u gornjem desnom uglu dok se nalazimo na stranici za editovanje post-a kliknemo na dugme Screen Options i tako otvorimo padajući meni, gde čekiramo opciju Custom Fields.
Custom Fields se sastoji iz dva polja i čini par tzv. key/value. Key bi bio podatak zapisan u polje “Name”, a vrednost koja je upisana u polje “Value”. Nakon što se popune polja “Name” i “Value” treba kliknuti na dugme Add Custom Field. Treba naglasiti da je dozvoljeno submitovati više različitih custom fields-a sa istim key-om. Ukoliko je key prethodno već korišćen onda će se pojaviti u padajućem meniju kada želimo da popunimo sledeći custom fields. Ali ukoliko ne želimo da se vrednost “key” pojavljuje u padajućem meniju za neko sledeće korišćenje onda naziv treba da počne sa underscore _
Baza podataka
Post meta informacije se čuvaju u tabeli “wp_postmeta”. Ta tabela se sastoji iz 4 polja:
- ‘meta_id’ – A unique id for each entry.
- ‘post_id’ – The ID of the post for this metadata.
- ‘meta_key’ – The name of the ‘key’.
- ‘meta_value’ – The value associated with the key.
Svaki put kad se klikne na “add custom field” podaci se ubace u bazu bez obzira dali će da se koriste ili ne !
Sačuvani podataci je multidimenzionalni niz koji se čuva u promenjivoj $post_meta_cache i izgleda slično ovom kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[ postid1 => [ key1 => [ val1, val2, ... ], key2 => [ val1, val2, ... ], ... ], postid2 => [ key1 => [ val1, val2, ... ], key2 => [ val1, val2, ... ], ... ], ... ] |
Add post meta()
Ukoliko koristimo standardni custom filds bez nekih specijalnih zahteva onda nam sledeće naredbe neće trebati, ali ako pravimo custom meta-box ova funkcija je neophodna!
1 |
add_post_meta($post_id, $meta_key, $meta_value, $unique) |
Dodaje custom filds nekom postu bilo kog post type-a. Parametri koji se koriste su:
- $post_id – (integer) (required) The ID of the post to which a custom field should be added.
- $meta_key – (string) (required) The key of the custom field which should be added.
- $meta_value – (mixed) (required) The value of the custom field which should be added. If an array is given, it will be serialized into a string.
- $unique – (boolean) (optional) Whether or not you want the key to stay unique. When set to true, the custom field will not be added if the given key already exists among custom fields of the specified post.
primer
U sledećem primeru se dodaje novo polje ako key već ne postoji ili se radi update ako postoji:
1 2 3 |
<if ( ! add_post_meta( 7, 'fruit', 'banana', true ) ) { update_post_meta ( 7, 'fruit', 'banana' ); } |
Update_post_meta()
Ukoliko koristimo standardni custom filds bez nekih specijalnih zahteva onda nam sledeće naredbe neće trebati, ali ako pravimo custom meta-box ova funkcija je neophodna!
1 |
update_post_meta($post_id, $meta_key, $meta_value, $prev_value) |
Ažurira vrednost polja Value. Parametri koji se koriste su:
- $post_id – (integer) (required) The ID of the post which contains the field you will edit.
- $meta_key -(string) (required) The key of the custom field you will edit. (this should be raw as opposed to sanitized for database queries)
- $meta_value – (mixed) (required) The new value of the custom field. A passed array will be serialized into a string.(this should be raw as opposed to sanitized for database queries)
- $prev_value – (mixed) (optional) The old value of the custom field you wish to change. This is to differentiate between several fields with the same key. If omitted, and there are multiple rows for this post and meta key, all meta values will be updated.
primer br.1
Ukoliko je u nekom postu sa ID=76 za key raspolozenje vrednost ‘Tuzan’ a želimo da ažuriramo vrednost na ‘srećan’.
1 |
update_post_meta( 76, 'raspolozenje', 'Srecan', 'Tuzan' ) |
primer br.2
U sledećem primeru koristimo jedan custom field sa parametrima key=’Price’ a value=’ceo broj koji je cena proizvoda u dolarima’. Ukoliko želimo za prozvode čija je cena preko 400, da dodamo novi post meta pod nazivom discount onda ćemo koristiti sledeću custom funkciju:
1 2 3 4 5 6 7 8 9 10 11 |
function add_discount_meta( $post_id ) { $price = get_post_meta($post_id, 'Price', true); if(strlen($price) > 0) { $discount = '0%'; if(intval(str_replace("$","",$price)) > 400 ) $discount = '15%'; update_post_meta( $post_id, 'Discount', $discount ); } } add_action( 'save_post', 'add_discount_meta' ); |
Nakon što uradimo Update stranice pojaviće se novi custom fild sa key=’Discount’ i Value=15%.
NAPOMENA:
U prethodnom primeru se ne koristi funkcija add_post_meta(). To je zahvaljujući osobini funkcije update_post_meta() koja u slučaju da ne postoji key sa vrednosti koju smo prosledili, sam poziva funkciju add_post_meta().
primer br.3
U sledećem primeru vršimo čuvanje novih polja u custom meta box-u:
1 2 3 4 5 6 7 8 9 10 11 |
function save_meta_box_data( $post_id ) { // Make sure that it is set. if ( ! isset( $_POST['myplugin_new_field'] ) ) { return; } // Sanitize user input. $my_data = sanitize_text_field( $_POST['myplugin_new_field'] ); // Update the meta field in the database. update_post_meta( $post_id, '_my_meta_value_key', $my_data ); } add_action( 'save_post', 'save_meta_box_data' ); |
Delete_post_meta()
1 |
delete_post_meta($post_id, $meta_key, $meta_value) |
Briše sve Custom Fields sa specifičnim key-om ili vrednosti kod specifičnog posta. Parametri koji se koriste su:
- $post_id – (integer) (required) The ID of the post from which you will delete a field.
- $meta_key – (string) (required) The key of the field you will delete.
- $meta_value – (mixed) (optional) The value of the field you will delete. This is used to differentiate between several fields with the same key. If left blank, all fields with the given key will be deleted.
Korišćenje podataka iz baze
Pod korišćenjem podrazumevamo prikupljanje podatka koji su ubačeni u bazu sa submitovanjem “add custom fields”.
Preko niza
Vadjenje podataka iz wp_postmeta tabele je isto kao da uzimamo podatke iz polja multidimenzionalnog niza. Ovaj postupak ću objasniti na sledećem primeru gde je potrebno prikupiti sve podatke iz nekog posta br.256 za key “reading’:
1 |
$readinglist = $post_meta_cache[256]['reading']; |
Dobijamo niz vrednosti koje odgovaraju poljima [val1, val2, …]
the_meta()
Ova funkcija izlistava i štampa sve meta podatke ubačene preko custom fieldsa ipreikazuje ih u vidu unoredered liste:
1 2 3 4 5 |
<ul class='post-meta'> <li><span class='post-meta-key'>Key 1:</span> Value for Key 1</li> <li><span class='post-meta-key'>Key 2:</span> Value for Key 2</li> <li><span class='post-meta-key'>Key 3:</span> Value for Key 3</li> </ul> |
get_post_meta()
Ova funkcija je dosta fleksibilnija i vraća vrednost samo za odredjeni key.
1 |
get_post_meta($post_id, $key, $single); |
Gde je:
- $post_id (int) – je ID posta u kome je upisan meta-data u custom fields-u.
Na ovom mestu koristiti sledeći template tag get_the_ID() da bi dobili dinamički ID u okviru WordPress Loop-a. Takodje u loop-u možemo i koristiti globalnu promenjivu i njen parametra ID $post->ID . - $key (string) – je tekst koja je upisana u “key” polje.
- $single -može biti true ili false.
- true (boolen) – vraća jednu vrednost kao string
- false ili ako nije definisano – vraća niz
Opcija false se koristi u slučaju da je submitovano više različitih custom fields-a sa istim key-om, pa treba da se izlista ceo niz. Ovo je objašnjeno na sledećem primeru kad je uneto više custom filds-a sa nazivom pesme.
1234567<?php $pesme = get_post_meta($post->ID, 'pesme', false); ?><h3>Ovaj post je pisan dok su se slušale sledeće pesme:</h3><ul><?php foreach($pesme as $song) {echo '<li>'.$song.'</li>';} ?></ul>
Primeri korišćenja:
Ukoliko želimo da se u postu pojavi samo odredjena custom filds tj samo sa odedjenim key-om onda je neophodno da napišemo IF petlju kao na sledećem primeru:
1 2 3 4 5 6 7 8 9 10 |
//Provera da li postiji key pesme <?php $pesme = get_post_meta($post->ID, 'pesme', true); if ($pesme) { ?> Slušali ste: <?php echo $pesme; ?> <?php } //Ako nema pesama popunjenih u custom filds-u else { ?> Niste slušali nikakvu muziku dok ste pisali post <?php } ?> |
Ili da prikažemo neki link samo ako ima popunjen Custom Fields sa key-om “link”
1 2 3 4 5 6 |
// Provera dali je popunjeno custom polje link <?php $link=get_post_meta($post->ID, 'facebook', true); if( $link != '' ) : ?> <a href="<?php echo $link; ?>"> link </a> <?php endif; ?> |
get_post_custom()
Vraća multidimenzionalni niz sa svim custom fields poljima na tom postu ili strani.
1 |
get_post_custom($post_id) |
Gde je $post_id broj posta (integer). Na sledećem primeru vraća u postu koji ima custom fields sa key-om “pesme”
1 2 3 4 5 6 7 |
<?php $custom_fields = get_post_custom($post->ID); $my_custom_field = $custom_fields['pesme']; foreach ( $my_custom_field as $key => $value ) { echo $key . " => " . $value . "<br />"; } ?> |
get_post_custom_keys()
Vraća sve ključeve iz custom fields-a korišćene u jednom postu.
get_post_custom_keys($post_id)
get_post_custom_values
Vraća niz sa svim vrednostima odredjenog key-a.
1 |
get_post_custom_values($key, $post_id) |
Gde je:
$key – (string) key za onu vrednost koju tražimo
post_id – opcioni broj (integer) posta ID
1 2 3 4 5 6 |
<?php $mykey_values = get_post_custom_values( 'pesme' ); foreach ( $mykey_values as $key => $value ) { echo "$key => $value" <br />; } ?> |
Custom filds kao uslov
Custom fields može biti i uslov za prikazivanje postova u nekom loop-u. Tada se u custom petlji
za WP_Query mogu koristi parametri za Custom Filds:
- meta_key
- meta_value
- meta_value_num
- meta_compare
- meta_query
Na sledećem primeru se prikazuju samo postovi koji imaju korišćen key “pesme”
1 2 3 4 5 6 7 |
<?php $query = new WP_Query( array( 'meta_key' => 'pesme' ) ); if($query->have_posts()) : while($query->have_posts()) : $query->the_post() the_content() endwhile endif?> |