Cum pot adăuga un atribut suplimentar în secțiunea 'Atribute Pagină' din wp-admin pentru pagini?
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ă?

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.

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

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

Î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.

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

Referință mutată la https://developer.wordpress.org/reference/functions/page_attributes_meta_box/

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;
