Come posso aggiungere un attributo extra nella sezione 'Attributi di Pagina' in wp-admin per le pagine?
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?

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.

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

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

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.

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' );

Riferimento spostato a https://developer.wordpress.org/reference/functions/page_attributes_meta_box/

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;
