Există o modalitate de a seta câmpuri personalizate implicite la crearea unui articol?

24 sept. 2011, 19:46:22
Vizualizări: 18.6K
Voturi: 13

Când creez un articol nou, imediat după ce apăs "Adaugă nou", când editorul de articole apare, în loc să folosesc dropdown-ul și să aleg un câmp personalizat, aș dori să am deja deschise câteva câmpuri personalizate implicite.

Vizual, în loc de:

Editor WordPress cu câmpuri personalizate închise

Aș dori să am ceva de genul:

Editor WordPress cu câmpuri personalizate deschise implicit

Știu că există plugin-uri pentru asta (CPT, More fields, etc.) dar aș dori o metodă simplă de a face asta cu o funcție de bază.

Am încercat ceva de genul (folosesc un tip de articol personalizat 'product'):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Dar asta nu pare să funcționeze. Cred că hook-ul este probabil greșit (pentru că edit_post apare după o actualizare), dar nu văd niciun hook pentru "articol nou" (imediat după ce utilizatorul apasă pe "articol nou" în wp admin). Există vreunul?

Sau poate întreaga idee este greșită și există altă metodă?

0
Toate răspunsurile la întrebare 5
2

Action hook-ul save_post este apelat la salvarea postării, dar nu sunt sigur dacă poți adăuga metadate în acest moment. Totuși, ar trebui să fie posibil să creezi/actualizezi metadatele după ce postarea a fost salvată folosind action hook-ul updated_post_meta.

EDIT

Pentru a pre-selecta câmpuri meta (câmpuri personalizate) în ecranul de creare a postării, trebuie mai întâi să adaugi aceste valori meta cu o valoare goală.

Dacă te uiți la funcția post_custom_meta_box() (care este callback-ul pentru metabox-ul utilizat postcustom) din fișierul wp-admin/includes/meta-boxes.php, poți observa că funcția folosește list_meta() pentru a crea câmpurile meta pre-selectate.

Acum să urmărim fluxul programului până când acest metabox este afișat (Căutăm un action/filter hook pe care îl putem folosi aici):

  1. WordPress încarcă fișierul post-new.php
  2. Acest fișier generează o postare implicită în baza de date pe linia 39 cu funcția get_default_post_to_edit(). Asta e bine. Practic, postarea este deja în baza de date ca un auto-draft. Din păcate, nu există niciun hook în acest moment pentru a modifica aceste date sau a adăuga ceva nou.
  3. Următorul pas, fișierul edit-form-advaned.php este inclus. Acest fișier va genera întreaga pagină de administrare și va include toate metabox-urile necesare bazate pe parametrul supports al tipului de postare.
  4. Pe linia 136 metabox-ul pentru câmpuri personalizate postcustom este inclus și funcția menționată mai sus este apelată. Din nou, niciun action hook pe care l-am putea folosi.

Concluzie

Cred că singura modalitate prin care poți face acest lucru este să folosești jQuery sau să suprascrii metabox-ul postcustom și să adaugi valorile meta înainte de a rula funcția list_meta().

De exemplu:

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // poate add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Câmpuri Personalizate'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Adaugă metadatele la postarea cu ID-ul $post->ID
    add_post_meta($post->ID, 'cheie', 'valoare');

    // apoi copiază și lipește conținutul metabox-ului din funcția post_custom_meta_box()
}
24 sept. 2011 20:26:48
Comentarii

Problema este că acum nu încerc să adaug ceva la salvare, ci încerc să afișez câteva câmpuri personalizate deja deschise când utilizatorul ajunge pe pagina de editare (vezi actualizările cu capturi de ecran)

mike23 mike23
25 sept. 2011 16:19:11

Ah. Acum înțeleg problema ta. Am editat răspunsul meu.

Roman Roman
25 sept. 2011 19:41:02
0

Acesta este metoda corectă de a adăuga suport pentru câmpuri personalizate (nu veți obține câmpuri goale la editarea articolelor)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // valoare implicită
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
13 feb. 2013 02:34:21
4

Caut să am o meta descriere unică pentru fiecare post personalizat pe un site WordPress pe care îl dezvolt. Așadar, am căutat și un câmp personalizat implicit și am ajuns aici.

Știu că acesta este un post destul de vechi, dar am crezut că voi posta răspunsul simplu pe care l-am găsit pe mariokostelac.com.

kg este spațiul meu de nume, puteți denumi funcția cum doriți. Sunt destul de nou în ceea ce privește hook-urile și personalizarea WP în general, dar cred că wp_insert_post este hook-ul pe care îl căutați.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
13 sept. 2012 15:01:41
Comentarii

PS: Există get_post_type(). De asemenea, atunci când faci comparații slabe, ar trebui să folosești sintaxa condițională în stil YODA.

kaiser kaiser
4 oct. 2012 12:41:37

@kaiser la ce te referi cu stilul YODA? De asemenea, de ce este get_post_type($post_id) mai bun decât $_GET['post_type']?

Aziz Aziz
3 mai 2016 19:47:03

Folosește valoarea înaintea comparației: 'page' === $_GET['post_type']. Altfel, când uiți un singur = poți ajunge într-o situație în care atribui o valoare în loc să compari două valori. Și asta se poate transforma în gunoi în baza ta de date. S-ar putea să vrei să folosești și ===, comparație type safe (valoarea este page? și valoarea este de tipul string?)

kaiser kaiser
3 mai 2016 19:51:21

@kasier Înțeleg - deci codul final arată cam așa: 'page' === get_post_type($post_id) ?

Aziz Aziz
3 mai 2016 19:52:18
0

Ar trebui să utilizați acțiunea save_post și să izolați operația prin verificarea tipului de postare, deoarece aceasta rulează pentru toate tipurile de postări. Evident, va trebui să adăugați mai multă logică pentru a o face să funcționeze conform nevoilor dumneavoastră. Probabil ar fi bine să setați un câmp meta pentru postare care să verifice dacă ați setat deja valorile implicite, astfel încât utilizatorii să nu fie frustrați dacă doresc să lase un câmp meta gol.

Dacă doriți ca valorile implicite să fie nule (așa cum se vede în exemplul dumneavoastră de cod), atunci nu este necesar să creați o funcție, deoarece aceasta doar adaugă overhead, iar câmpurile meta pentru postări nu sunt populate cu valori în mod implicit.

function register_custom_fields( $post_ID ) {
    //Verificați nonce aici
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'valoare_implicita';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'valoare_implicita';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
25 sept. 2011 07:42:46
0

Dacă cineva are nevoie să preia un câmp personalizat după tipul de postare, las mai jos codul pe care l-am folosit și care funcționează bine pentru mine :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action('wp_insert_post','awh_field_type');

19 mai 2016 21:27:35