Come posso aggiungere un attributo extra nella sezione 'Attributi di Pagina' in wp-admin per le pagine?

8 mar 2012, 23:17:36
Visualizzazioni: 26.2K
Voti: 14

Vorrei aggiungere una lista a tendina nel box Attributi di Pagina che si vede sul lato destro nell'interfaccia di amministrazione per le pagine.

Qualcuno sa se questo è possibile?

O almeno aggiungere una casella personalizzata sotto questo box?

0
Tutte le risposte alla domanda 2
3
18

Non ci sono hook convenienti per aggiungere qualcosa a quella box.

Puoi fare una di queste due cose.

1. Aggiungere un nuovo Meta Box

Puoi farlo agganciandoti all'azione add_meta_boxes e chiamando add_meta_box. Puoi specificare una funzione di callback nella tua chiamata ad add_meta_box. Quella callback si occuperà di visualizzare la tua lista di selezione.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Aggiunge il meta box alla schermata della pagina
 */
function wpse44966_add_meta_box()
{
    add_meta_box(
        'wpse44966-meta-box', // id, usato come attributo html id
        __( 'WPSE 44966 Meta Box' ), // titolo del meta box, come "Page Attributes"
        'wpse44966_meta_box_cb', // funzione di callback, mostra il contenuto
        'page', // tipo di post o pagina. Lo aggiungeremo solo alle pagine
        'side', // contesto (dove nello schermo)
        'low' // priorità, dove dovrebbe posizionarsi nel contesto?
    );
}

/**
 * Funzione di callback per il nostro meta box. Visualizza il contenuto
 */
function wpse44966_meta_box_cb( $post )
{
    // crea qui il tuo menu a discesa
}

2. Rimuovere il Meta Box predefinito Page Attributes e aggiungere la tua versione

Tutto il contenuto nella schermata di modifica del post, ad eccezione dell'editor principale e dell'area del titolo, è un meta box. Puoi rimuoverli chiamando remove_meta_box, per poi sostituirli con i tuoi.

Quindi, per prima cosa, modifica la funzione di aggiunta sopra per includere una chiamata a remove_meta_box. Poi dovrai copiare il corpo della funzione page_attributes_meta_box da wp-admin/includes/meta-boxes.php e inserire il tuo codice sotto di essa.

<?php
add_action( 'add_meta_boxes', 'wpse44966_add_meta_box' );
/**
 * Aggiunge il meta box alla schermata della pagina
 */
function wpse44966_add_meta_box( $post_type )
{
    // rimuovi quello predefinito
    remove_meta_box(
        'pageparentdiv',
        'page',
        'side'
    );

    // aggiungi il nostro
    add_meta_box(
        'wpse44966-meta-box',
        'page' == $post_type ? __('Page Attributes') : __('Attributes'),
        'wpse44966_meta_box_cb', 
        'page', 
        'side', 
        'low'
    );
}

/**
 * Funzione di callback per il nostro meta box. Visualizza il contenuto
 */
function wpse44966_meta_box_cb( $post )
{
    // Copia qui il contenuto della funzione `page_attributes_meta_box`
    // aggiungi il tuo menu a discesa
}

In entrambi i modi, dovrai agganciarti a save_post per salvare il valore del tuo campo con add_post_meta e/o update_post_meta.

<?php
add_action( 'save_post', 'wpse44966_save_post' );
/**
 * Salva il valore del nostro campo personalizzato
 */
function wpse44966_save_post( $post_id )
{
    // controlla nonce, permessi qui
    // salva i dati con update_post_meta
}

Questo tutorial potrebbe esserti d'aiuto.

8 mar 2012 23:43:40
Commenti

Grazie per l'ottima risposta. Speravo in qualche tipo di hook, ma questa soluzione andrà benissimo :)

Steven Steven
8 mar 2012 23:53:46

soluzione eccellente e risposta completa - il link di riferimento colma le lacune - grazie

Q Studio Q Studio
5 dic 2012 15:08:26

A partire da WordPress 4.9 esiste un action hook page_attributes_misc_attributes che viene attivato subito dopo il campo Ordine e appena prima del testo di aiuto nella parte inferiore di questo meta box, consentendo l'espansione del meta box invece di doverlo sostituire. Passa un singolo argomento, $post, l'oggetto del post corrente.

Andy Macaulay-Brook Andy Macaulay-Brook
12 lug 2018 13:42:59
2

Evviva! A partire da WP 4.9.0, è disponibile un action hook per aggiungere codice al meta box Attributi pagina: 'page_attributes_misc_attributes'. Consulta il Codex per riferimento.

Esempio:

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( 'Etichetta Opzione', '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 ott 2020 23:10:09
Commenti

Nota importante: Se stai utilizzando l'ID del post in qualche modo nel tuo valore di salvataggio, verifica prima che non sia una revisione. Io lo usavo per salvare un'opzione del sito basata sull'ID del post, ma a volte salvava l'ID della revisione, creando problemi. Per farlo, aggiungi if( ! wp_is_post_revision( $post_id ) return;

Jeremy Carlson Jeremy Carlson
3 set 2024 20:01:42