Adăugare câmp de input în 'Pagini > Editare Pagină' prin functions.php

1 iul. 2013, 15:22:06
Vizualizări: 14.2K
Voturi: 2

Întrebare originală:

Încerc să adaug un câmp de input în 'Pagini > Editare Pagină'. Scopul acestui câmp este să permită utilizatorului să adauge un ID de slider, astfel încât acel slider să fie specific paginii.

Exemplu:

  • Utilizatorul adaugă ID-ul sliderului în câmpul de input din ecranul de editare pagină.
  • Pagina preia acel ID.

Mulțumesc tuturor celor care au răspuns, sunteți o comunitate minunată, am primit ajutor excelent de pe acest site, vă mulțumesc!

REZULTAT FINAL

functions.php

// Adaugă câmp personalizat pentru Slider ID în 'Editare Pagină'
add_action( 'add_meta_boxes', 'cd_meta_box_add' );
function cd_meta_box_add() {
    add_meta_box( 'my-meta-box-id', 'Slider', 'cd_meta_box_cb', 'page', 'normal', 'high' );
}
function cd_meta_box_cb( $post ) {
    $values = get_post_custom( $post->ID );
    $text = isset( $values['my_meta_box_text'] ) ? esc_attr( $values['my_meta_box_text'][0] ) : '';
    wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
    ?>
    <p>
        <label for="my_meta_box_text">Adaugă un ID slider</label>
        <input type="text" name="my_meta_box_text" id="my_meta_box_text" value="<?php echo $text; ?>" />
    </p>
    <?php   
}
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id ) {
    // Oprește dacă salvarea este automată
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    // dacă nonce-ul nu există sau nu poate fi verificat, oprește
    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
    // dacă utilizatorul curent nu poate edita postarea, oprește
    if( !current_user_can( 'edit_post', $post_id ) ) return;
    // acum putem salva datele
    $allowed = array( 
        'a' => array( // permite doar tag-uri a
            'href' => array() // și aceste ancore pot avea doar atributul href
        )
    );
    // Este bine să verifici dacă datele sunt setate
    if( isset( $_POST['my_meta_box_text'] ) )
        update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) );
}

Page.php

<?php echo do_shortcode( '[cycloneslider id="' . get_post_meta(get_the_ID(), 'my_meta_box_text', true) . '"]'); ?>
5
Comentarii

De ce nu folosești un plugin pentru asta (mai ales dacă nu ești programator)? Advanced Custom Fields ar trebui să facă treaba pentru tine.

Krzysiek Dróżdż Krzysiek Dróżdż
1 iul. 2013 15:23:53

Mulțumesc foarte mult pentru răspuns (și atât de rapid!).

Chiar nu am vrut să folosesc un plugin, aș fi preferat ca funcționalitatea să fie inclusă în Child Theme. Ideea principală este ca acest Child Theme să nu necesite plugin-uri speciale și să poată fi ușor editat.

Sunt complet dispus să fac lucrurile pe calea cea mai grea, pentru mine, merita efortul :)

Paxjah Paxjah
1 iul. 2013 15:34:57

@user771764 Dacă vrei să salvezi ID-ul slider-ului pentru fiecare pagină în parte, ar trebui să folosești post meta boxes http://codex.wordpress.org/Function_Reference/add_meta_box în loc de wp options.

Vinod Dalvi Vinod Dalvi
1 iul. 2013 15:41:34

@Vinod Davli - Mulțumesc foarte mult pentru sfat! Îl pun în aplicare acum, am o întrebare rapidă - cum ar trebui să obțin valoarea, pentru wp option am folosit 'get_option' dar ce aș folosi pentru meta? Mulțumesc din nou :)

Paxjah Paxjah
1 iul. 2013 15:48:01

Folosește get_post_meta (http://codex.wordpress.org/Function_Reference/get_post_meta).

Krzysiek Dróżdż Krzysiek Dróżdż
1 iul. 2013 15:54:37
Toate răspunsurile la întrebare 3
0

functions.php

// Adaugă un câmp personalizat pentru ID-ul Slider-ului în 'Editare Pagină'
add_action( 'add_meta_boxes', 'cd_meta_box_add' );
function cd_meta_box_add() {
    add_meta_box( 'my-meta-box-id', 'Slider', 'cd_meta_box_cb', 'page', 'normal', 'high' );
}
function cd_meta_box_cb( $post ) {
    $values = get_post_custom( $post->ID );
    $text = isset( $values['my_meta_box_text'] ) ? esc_attr( $values['my_meta_box_text'][0] ) : '';
    wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );
    ?>
    <p>
        <label for="my_meta_box_text">Adaugă un ID de slider</label>
        <input type="text" name="my_meta_box_text" id="my_meta_box_text" value="<?php echo $text; ?>" />
    </p>
    <?php   
}
add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id ) {
    // Oprire dacă salvarea este automată
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    // dacă nonce-ul nu există sau nu poate fi verificat, oprire
    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) return;
    // dacă utilizatorul curent nu poate edita această postare, oprire
    if( !current_user_can( 'edit_post', $post_id ) ) return;
    // acum putem salva datele
    $allowed = array( 
        'a' => array( // permitem doar tag-uri a
            'href' => array() // și aceste ancore pot avea doar atributul href
        )
    );
    // Este o idee bună să te asiguri că datele tale sunt setate
    if( isset( $_POST['my_meta_box_text'] ) )
        update_post_meta( $post_id, 'my_meta_box_text', wp_kses( $_POST['my_meta_box_text'], $allowed ) );
}

Page.php

<?php echo do_shortcode( '[cycloneslider id="' . get_post_meta(get_the_ID(), 'my_meta_box_text', true) . '"]'); ?>
4 iul. 2013 18:25:47
4

În primul rând, ar trebui să utilizați câmpuri personalizate, dacă doriți să atribuiți o valoare suplimentară unui articol/pagină și nu global pentru întregul site.

Apoi ar trebui să utilizați funcția add_meta_box pentru a vă înregistra caseta meta personalizată, care vă va permite să editați aceste câmpuri personalizate cu ușurință.

Iată un exemplu de cod:

// înregistrează caseta meta personalizată
function my_slider_properties_meta_box() {
    add_meta_box('my_slider_properties', 'Titlul URL-ului pentru Formatul Link', 'my_slider_properties', 'page', 'side', 'default');
}
add_action('add_meta_boxes', 'my_slider_properties_meta_box');


// afișează caseta meta personalizată
function my_slider_properties() {
    global $post; 

    $my_slider_id = get_post_meta($post->ID, '_my_slider_id', true);

    echo '<p>ID-ul slider-ului meu</p>';
    echo '<input type="text" name="_my_slider_id" value="' . esc_attr($my_slider_id)  . '" size="40" />';
}


// procesează caseta meta personalizată la salvarea articolului
function my_slider_properties_save_meta($post_id, $post) {
    if ( !current_user_can( 'edit_post', $post->ID ))
        return $post->ID;

    $metas['_my_slider_id'] = $_POST['_my_slider_id'];

    foreach ($metas as $key => $value) {
        update_post_meta($post->ID, $key, $value);
    }
}
add_action('save_post', 'my_slider_properties', 1, 2);

Acesta este doar un exemplu de bază despre cum să faceți acest lucru. Ar trebui să aveți grijă de securitate (folosiți nonces) și de alte aspecte, cred. Dar ideea ar trebui să fie clară acum.

(6 caractere)

1 iul. 2013 15:54:04
Comentarii

Folosește add_meta_box('my_slider_properties', 'Link Format Title URL', 'my_slider_properties', 'page', 'side', 'default'); și nu add_meta_box('my_slider_properties', 'Link Format Title URL', 'my_slider_properties', 'post', 'side', 'default'); deoarece utilizatorul dorește să folosească meta post în pagini și nu în articole.

Vinod Dalvi Vinod Dalvi
1 iul. 2013 16:18:35

Mulțumesc, am trecut cu vederea asta. Ai dreptate, el a dorit să o adauge la pagini nu la articole :) Am editat codul meu, așa că ar trebui să fie în regulă acum.

Krzysiek Dróżdż Krzysiek Dróżdż
1 iul. 2013 16:24:13

@Vinod Dalvi și Krzysiek Dróżdż - Vă mulțumesc amândurora! Am reușit să fac slider-ul funcțional acum și se apelează din template, dar afișează primul slider creat pe fiecare pagină și de asemenea nu păstrează valoarea fiecărui slider în câmpul de text.

Paxjah Paxjah
1 iul. 2013 16:33:47

Am actualizat postarea mea originală, aș aprecia foarte mult orice alt feedback pe care îl puteți oferi :)

Paxjah Paxjah
1 iul. 2013 18:31:25
1

Dacă dorești să salvezi ID-ul slider-ului pentru o pagină specifică pentru toate paginile, atunci ar trebui să folosești cutii meta pentru postări în loc de opțiuni WP.

Pentru a obține valoarea din meta datele postării, folosește funcția get_post_meta() în loc de funcția get_option().

1 iul. 2013 16:15:14
Comentarii

Am editat postarea mea inițială, acum este răspunsă, vă mulțumesc tuturor :)

Paxjah Paxjah
1 iul. 2013 18:46:02