Cum pot adăuga un atribut suplimentar în secțiunea 'Atribute Pagină' din wp-admin pentru pagini?

8 mar. 2012, 23:17:36
Vizualizări: 26.2K
Voturi: 14

Aș dori să adaug o listă derulantă în caseta Atribute Pagină pe care o vedeți în partea dreaptă în interfața de administrare pentru pagini.

Știe cineva dacă acest lucru este posibil?

Sau cel puțin să adaug o casetă personalizată sub această casetă?

0
Toate răspunsurile la întrebare 2
3
18

Nu există hook-uri convenabile pentru a adăuga ceva în acea cutie.

Aveți două opțiuni.

1. Adăugați o nouă Meta Box

Puteți face acest lucru prin conectarea la acțiunea add_meta_boxes și apelarea funcției add_meta_box. Puteți specifica o funcție de callback în apelul către add_meta_box. Acea funcție de callback se va ocupa de afișarea listei dvs. de selecție.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Adaugă meta box-ul pe ecranul paginii
 */
function wpse44966_add_meta_box()
{
    add_meta_box(
        'wpse44966-meta-box', // id, folosit ca atribut html id
        __( 'WPSE 44966 Meta Box' ), // titlul meta box-ului, ca "Atribute Pagină"
        'wpse44966_meta_box_cb', // funcția de callback, afișează conținutul
        'page', // tipul de postare sau pagină. Vom adăuga doar pe pagini
        'side', // context (unde pe ecran)
        'low' // prioritate, unde ar trebui să fie poziționat în context?
    );
}

/**
 * Funcția de callback pentru meta box-ul nostru. Afișează conținutul
 */
function wpse44966_meta_box_cb( $post )
{
    // creați aici lista dvs. de selecție
}

2. Eliminați Meta Box-ul implicit "Atribute Pagină", adăugați propria versiune

Tot conținutul de pe ecranul de editare a postării, cu excepția editorului principal și a zonei de titlu, este un meta box. Puteți le elimina prin apelarea funcției remove_meta_box, apoi le puteți înlocui cu propriile.

Deci, mai întâi modificați funcția de adăugare de mai sus pentru a include un apel remove_meta_box. Apoi va trebui să copiați corpul funcției page_attributes_meta_box din wp-admin/includes/meta-boxes.php și să adăugați elementele dvs. sub ea.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Adaugă meta box-ul pe ecranul paginii
 */
function wpse44966_add_meta_box( $post_type )
{
    // elimină meta box-ul implicit
    remove_meta_box(
        'pageparentdiv',
        'page',
        'side'
    );

    // adaugă meta box-ul nostru
    add_meta_box(
        'wpse44966-meta-box',
        'page' == $post_type ? __('Atribute Pagină') : __('Atribute'),
        'wpse44966_meta_box_cb', 
        'page', 
        'side', 
        'low'
    );
}

/**
 * Funcția de callback pentru meta box-ul nostru. Afișează conținutul
 */
function wpse44966_meta_box_cb( $post )
{
    // Copiați aici conținutul funcției `page_attributes_meta_box`
    // adăugați lista dvs. de selecție
}

Indiferent de metoda aleasă, va trebui să vă conectați la save_post pentru a salva valoarea câmpului dvs. cu add_post_meta și/sau update_post_meta.

<?php
add_action( 'save_post', 'wpse44966_save_post' );
/**
 * Salvează valoarea câmpului nostru personalizat
 */
function wpse44966_save_post( $post_id )
{
    // verificați nonce-urile, permisiunile aici
    // salvați datele cu update_post_meta
}

Acest tutorial vă poate fi de ajutor.

8 mar. 2012 23:43:40
Comentarii

Mulțumesc pentru răspunsul excelent. Speram la un fel de hook, dar această soluție este perfectă :)

Steven Steven
8 mar. 2012 23:53:46

soluție excelentă și răspuns complet - linkul de referință completează lacunele - mulțumesc

Q Studio Q Studio
5 dec. 2012 15:08:26

Începând cu WordPress 4.9 există un action hook page_attributes_misc_attributes care se declanșează imediat după câmpul Order și înainte de textul de ajutor din partea de jos a acestui meta box, permițând extinderea meta box-ului în loc să fie nevoie să-l înlocuiești. Primește un singur argument, $post, obiectul postului curent.

Andy Macaulay-Brook Andy Macaulay-Brook
12 iul. 2018 13:42:59
2

Uraaa! Începând cu WP 4.9.0, există un action hook pentru a adăuga cod în meta box-ul Atributele Paginii: 'page_attributes_misc_attributes'. Consultă Codex pentru referință.

Exemplu:

function wpse44966_page_attributes( $post ) {

    wp_nonce_field( 'wpse44966_page_attributes_nonce', 'wpse44966_page_attributes_nonce' );
    ?>
    <p class="post-attributes-label-wrapper wpse44966-label-wrapper">
        <label class="wpse44966-label" for="wpse44966_option" style="font-weight: 600;"><?php _e( 'Etichetă Opțiune', 'textdomain' ); ?></label>
        <input id="wpse44966_option" name="wpse44966_option" type="checkbox" value="1" style="margin-left: 5px;"<?php if( isset( $post->wpse44966_option ) && $post->wpse44966_option ) echo ' checked="checked"'; ?>>
    </p>
    <?php
}
add_action( 'page_attributes_misc_attributes', 'wpse44966_page_attributes' );

function wpse44966_metabox_save_post( $post_id ) {
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    if( ! isset( $_POST['wpse44966_page_attributes_nonce'] ) || ! wp_verify_nonce( $_POST['wpse44966_page_attributes_nonce'], 'wpse44966_page_attributes_nonce' ) ) return;
    if( ! current_user_can( 'edit_post', $post_id ) ) return;
    $wpse44966_option = (int) ( isset( $_POST['wpse44966_option'] ) && $_POST['wpse44966_option'] );
    update_post_meta( $post_id, 'wpse44966_option', $wpse44966_option );
}
add_action( 'save_post', 'wpse44966_metabox_save_post' );
10 oct. 2020 23:10:09
Comentarii

Notă importantă: Dacă folosești ID-ul postării în vreun fel în valoarea salvată, verifică mai întâi că nu e o revizie. Am folosit asta pentru a salva o opțiune de site bazată pe ID-ul postării, dar uneori salva ID-ul reviziei, stricând lucrurile. Pentru a evita asta, adaugă if( ! wp_is_post_revision( $post_id ) return;

Jeremy Carlson Jeremy Carlson
3 sept. 2024 20:01:42