Din nou despre meta_box în WordPress


Spun “din nou” pentru că am mai amintit subiectul. În “Panouri” mobile în WP 2.7 aţi văzut chiar un screencast (în engleză) despre crearea lor. Dar era un exemplu banal. Ca subiectul să fie mai bine tratat, am să duc până la capăt o astfel de “cutie”. Mai întâi introducerea: în back-end-ul WordPress avem adesea “panouri” (sau cutiuţe) mobile, pe care le putem trage unde vrem sau minimiza/maximiza (ori chiar ascunde de la Opţiuni pagină). Vom crea un astfel de panou cu funcţia add_meta_box. De fapt vom crea două panouri: mai jos am evidenţiat cu 2 un panou banal, doar cu text; apoi cu 1 un panou ce foloseşte câmpurile personalizate (custom fields).

imagine

Desigur, panourile nu sunt utile doar pentru custom fields… dar în primul rând pentru ele. De ce? Pentru că ceea ce oferă nativ WP pentru editarea lor e destul de rudimentar. Există apoi o serie de pluginuri, dintre care More Fields este favoritul meu. Dar are evident limitele lui: modul de aranjare în panou nu îl poţi controla deloc. Totul e pus automat. Şi astfel, de exemplu la Catholica.ro, unde am vreo 10 câmpuri personalizate, panoul e prea lung, inutil de lung. Dacă vreau o formă mai compactată trebuie să o scriu singur. Pentru a uşura codul, de la 10 câmpuri am redus la 3 (observaţi 1-le “mărit” tot în captura de mai sus).

Codul de mai jos, o compilaţie din ce este în Codexul WP şi de prin alte surse, curăţat de metodele de compatibilitate cu versiuni WP mai vechi, îl aveţi în continuare. Cel mai simplu este pentru panoul „Ajutor ştiri”. Cu linia 1 începem procesul de definire a „meta_box”-ului, creată de fapt în linia 6(cu 7). Acolo apelăm o funcţie pentru conţinutul boxei. La conţinut avem o primă linie, un input, care nu trebuie priceput :) ci doar modificat name-ul şi id-ul corespunzător. Şi gata. Am creat un panou ce poate conţine un text care să fie mereu prezent când scriem un articol (post). Evident, se poate face şi pentru pagini.

add_action('admin_menu', 'ajutor_metabox');
add_action('admin_menu', 'stire_metabox');
add_action('save_post', 'stire_metabox_salvare');
 
function ajutor_metabox() {
    add_meta_box( 'ajutor_stiri_sectionid', 'Ajutor ştiri', 
        'ajutor_metabox_continut', 'post', 'advanced' );
}
 
function ajutor_metabox_continut() {
    echo '<input type="hidden" name="ajutor_noncename" id="ajutor_noncename" value="' . 
        wp_create_nonce( plugin_basename(__FILE__) ) . '" />';
    echo '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras rutrum mi non lacus laoreet porttitor. Nunc nec tellus sit amet dui bibendum ultricies. Nullam elit magna, tincidunt sed viverra eu, bibendum ut urna. Donec pharetra urna ut dui lacinia quis pellentesque enim vehicula. Suspendisse eu velit sit amet dui tincidunt convallis. Nulla ut nisi eget libero aliquam feugiat vitae eget metus. Nulla facilisi. Aliquam sapien tellus, fermentum dignissim varius non, sodales et lectus. Suspendisse eu turpis ac nisi rutrum commodo. Fusce sit amet urna ac nisl rhoncus mollis et ut odio. Sed vulputate placerat erat vel venenatis.</p>';
}
 
function stire_metabox() {
    add_meta_box( 'aditional_stiri_sectionid', 'Adiţional ştiri', 
        'stire_metabox_continut', 'post', 'advanced' );
}
    
function stire_metabox_continut() {
    echo '<input type="hidden" name="stiri_noncename" id="stiri_noncename" value="' . 
        wp_create_nonce( plugin_basename(__FILE__) ) . '" />';
    echo '<label for="Locatie">Locatie</label> ';
    echo '<input type="text" name="Locatie" value="' .
        get_post_meta($_GET['post'],"Locatie",true).'" size="25" /><br>';
    echo '<label for="Imagine">Imagine</label> ';
    echo '<input type="text" name="Imagine" value="' .
        get_post_meta($_GET['post'],"Imagine",true).'" size="25" /><br>';
    echo '<label for="Alt">Alt</label> ';
    echo '<input type="text" name="Alt" value="' .
        get_post_meta($_GET['post'],"Alt",true).'" size="25" /><br>';
}
 
function stire_metabox_salvare($post_id) {
    if (!wp_verify_nonce( $_POST['stiri_noncename'], plugin_basename(__FILE__) ))
        return $post_id;
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
        return $post_id;
    if ('page' == $_POST['post_type']) {
        if (!current_user_can( 'edit_page', $post_id))
            return $post_id;
    } else {
        if (!current_user_can( 'edit_post', $post_id))
            return $post_id;
    }
    update_post_meta($post_id,"Locatie",$_POST['Locatie']);
    update_post_meta($post_id,"Imagine",$_POST['Imagine']);
    update_post_meta($post_id,"Alt",$_POST['Alt']);
    return 1;
}

Am pus însă şi o boxă mai complicată, ce afişează trei câmpuri personalizate. După cum vedeţi mai sus, a fost nevoie să definim şi o funcţie pentru salvarea datelor. După nişte verificări (pentru ca să nu se facă salvare fără drept de salvare), facem actualizarea câmpurilor personalizate via update_post_meta. Atât! Foarte simplu. Pornind de la un astfel de cod, dacă folosiţi câmpuri personalizate, evident, puteţi să vă faceţi propriile panouri, oricâte, şi să le amplasaţi în partea de editare a articolelor unde doriţi. Reţineţi că într-un panou puteţi scrie ce cod doriţi, ceea ce vă dă o libertate foarte mare.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (Neevaluat încă)
Loading...Loading...

5 comentarii

  1. Andrei spune:

    In ce fisier trebuie sa modific?

  2. radu.capan spune:

    Acel cod, adaptat cu campurile personalizate proprii, poate fi pus in functions.php al temei folosite. Daca functions.php nu exista, se creaza. Se poate construi si un plugin, dar cel mai rapid e de pus in functions.php.

  3. Andrei spune:

    Multumesc, functioneaza.

  4. Andrei spune:

    La custom fields am: Name: „data lansare ro”. Functioneaza doar daca il bag manual dar daca il bag cu ajutorul codului de mai sus nu merge. Oare de ce?

  5. radu.capan spune:

    Pentru ca ai spatii in numele la custom field. Solutia: fa in codul nou introdus un replace la data lansare ro cu data-lansare-ro, apoi refa fara liniutze doar in doua locuri, ca sa ai
    get_post_meta($_GET[‘post’],”data lansare ro”,true)
    si
    update_post_meta($post_id,”data lansare ro”,$_POST[‘data-lansare-ro’])
    Va merge. Testat.


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *