Come posso inserire una casella meta personalizzata sopra l'editor ma sotto la sezione del titolo nella pagina di modifica del post?
Ho una casella meta personalizzata per un tipo di post personalizzato che il mio cliente vuole posizionare tra la sezione del titolo/permalink e l'editor dei post nel pannello di amministrazione. È possibile farlo e, in caso affermativo, quale hook/filtro/ecc. dovrei utilizzare?

- Aggiungi semplicemente un meta box utilizzando il contesto advanced e priorità high
- Quindi, agganciati all'hook
edit_form_after_title
Visualizza i tuoi meta box in quella posizione, poi rimuovili per evitare che appaiano due volte
// Sposta tutti i metabox "advanced" sopra l'editor predefinito add_action('edit_form_after_title', function() { global $post, $wp_meta_boxes; do_meta_boxes(get_current_screen(), 'advanced', $post); unset($wp_meta_boxes[get_post_type($post)]['advanced']); });

Un sito su cui sto lavorando registra alcune metabox utilizzando il parametro register_meta_box_cb
della funzione register_post_type
. Ho provato il tuo codice ma le metabox non si spostano sopra l'editor. Questo metodo può essere utilizzato nel mio caso? Grazie

Consiglierei di utilizzare un $context
personalizzato, invece di advanced
, usa qualcosa come my_before_editor
, in modo da non spostare tutte le metabox nel contesto advanced
, ma puntare specificamente alle tue metabox... vedi https://developer.wordpress.org/reference/functions/add_meta_box/

edit_form_after_title
non è supportato dall'editor a blocchi https://github.com/WordPress/gutenberg/issues/5821

Ecco come puoi spostare i meta box specifici sopra l'editor, ma prima di postare il codice vorrei ringraziare Andrew e mhulse. Ragazzi, siete fantastici!
function foo_deck( $post_type ) {
if ( in_array( $post_type, array( 'post', 'page' ) ) ) {
add_meta_box(
'contact_details_meta',
'Dettagli Contatto',
'contact_details_meta',
$post_type,
'test', // cambia in qualcosa di diverso da normal, advanced o side
'high'
);
}
}
add_action('add_meta_boxes', 'foo_deck');
function foo_move_deck() {
# Ottieni le variabili globali:
global $post, $wp_meta_boxes;
# Output dei meta box "advanced":
do_meta_boxes( get_current_screen(), 'test', $post );
# Rimuovi i meta box "advanced" iniziali:
unset($wp_meta_boxes['post']['test']);
}
add_action('edit_form_after_title', 'foo_move_deck');

Per fornire un esempio di codice completo basato sulla risposta di Andrew... avevo bisogno di un modo per includere un "Deck" (ovvero un sottotitolo) nei miei post; volevo che il campo deck apparisse dopo la barra del titolo principale.
/**
* Aggiunge un meta box "deck" (ovvero sottotitolo) alla pagina dei post e lo posiziona
* sotto il titolo.
*
* @todo Spostare in una classe.
* @see http://codex.wordpress.org/Function_Reference/add_meta_box
* @see http://wordpress.org/extend/ideas/topic/add-meta-box-to-multiple-post-types
* @see https://github.com/Horttcore/WordPress-Subtitle
* @see http://codex.wordpress.org/Function_Reference/wp_nonce_field
*/
# Aggiunge un box alla colonna principale nelle schermate di modifica di Post e Pagina:
function foo_deck($post_type) {
# Tipi di post consentiti per mostrare il meta box:
$post_types = array('post', 'page');
if (in_array($post_type, $post_types)) {
# Aggiunge un meta box all'interfaccia amministrativa:
add_meta_box(
'foo-deck-meta-box', // Attributo HTML 'id' della sezione della schermata di modifica.
'Deck', // Titolo della sezione della schermata di modifica, visibile all'utente.
'foo_deck_meta_box', // Funzione che stampa l'HTML per la sezione della schermata di modifica.
$post_type, // Il tipo di schermata di scrittura in cui mostrare la sezione di modifica.
'advanced', // La parte della pagina in cui la sezione di modifica dovrebbe essere mostrata.
'high' // La priorità all'interno del contesto in cui i box dovrebbero apparire.
);
}
}
# Callback che stampa il contenuto del box:
function foo_deck_meta_box($post) {
# Usa `get_post_meta()` per recuperare un valore esistente dal database e usarlo per il form:
$deck = get_post_meta($post->ID, '_deck', true);
# Campo del form da visualizzare:
?>
<label class="screen-reader-text" for="foo_deck">Deck</label>
<input id="foo_deck" type="text" autocomplete="off" value="<?=esc_attr($deck)?>" name="foo_deck" placeholder="Deck">
<?php
# Visualizza il campo del form nascosto nonce:
wp_nonce_field(
plugin_basename(__FILE__), // Nome dell'azione.
'foo_deck_meta_box' // Nome del nonce.
);
}
/**
* @see https://wordpress.stackexchange.com/a/16267/32387
*/
# Salva i nostri dati personalizzati quando il post viene salvato:
function foo_deck_save_postdata($post_id) {
# L'utente corrente è autorizzato a compiere questa azione?
if ((($_POST['post_type'] === 'page') && current_user_can('edit_page', $post_id) || current_user_can('edit_post', $post_id))) { // Se è una pagina, OPPURE, se è un post, l'utente può modificarlo?
# Impedisce a WP di cancellare i campi personalizzati durante l'autosalvataggio:
if ((( ! defined('DOING_AUTOSAVE')) || ( ! DOING_AUTOSAVE)) && (( ! defined('DOING_AJAX')) || ( ! DOING_AJAX))) {
# Verifica del nonce:
if (wp_verify_nonce($_POST['foo_deck_meta_box'], plugin_basename(__FILE__))) {
# Ottiene il deck postato:
$deck = sanitize_text_field($_POST['foo_deck']);
# Aggiungere, aggiornare o eliminare?
if ($deck !== '') {
# Il deck esiste, quindi aggiungilo OPPURE aggiornalo:
add_post_meta($post_id, '_deck', $deck, true) OR update_post_meta($post_id, '_deck', $deck);
} else {
# Deck vuoto o rimosso:
delete_post_meta($post_id, '_deck');
}
}
}
}
}
# Ottiene il deck:
function foo_get_deck($post_id = FALSE) {
$post_id = ($post_id) ? $post_id : get_the_ID();
return apply_filters('foo_the_deck', get_post_meta($post_id, '_deck', TRUE));
}
# Visualizza il deck (sarà più elegante con la OOP):
function foo_the_deck() {
echo foo_get_deck(get_the_ID());
}
# Controllo condizionale:
function foo_has_subtitle($post_id = FALSE) {
if (foo_get_deck($post_id)) return TRUE;
}
# Definisce il box personalizzato:
add_action('add_meta_boxes', 'foo_deck');
# Fa qualcosa con i dati inseriti:
add_action('save_post', 'foo_deck_save_postdata');
/**
* @see https://wordpress.stackexchange.com/questions/36600
* @see https://wordpress.stackexchange.com/questions/94530/
*/
# Ora sposta i meta box avanzati dopo il titolo:
function foo_move_deck() {
# Ottiene le variabili globali:
global $post, $wp_meta_boxes;
# Visualizza i meta box "avanzati":
do_meta_boxes(get_current_screen(), 'advanced', $post);
# Rimuove i meta box "avanzati" iniziali:
unset($wp_meta_boxes['post']['advanced']);
}
add_action('edit_form_after_title', 'foo_move_deck');
Ovviamente, il codice sopra potrebbe essere migliorato, ma dovrebbe aiutare gli altri che cercano di fare la stessa cosa (la risposta di Andrew ha fatto luce, ma ho pensato che potesse essere utile fornire un esempio funzionante).
Anche questa risposta ha aiutato.
Miglioramenti che potrebbero essere apportati:
- Renderlo OOP/con classe(i).
- Aggiungere stili/js per farlo apparire/sentire/comportarsi come il campo del titolo.
Ho intenzione di apportare i miglioramenti sopra citati in futuro, ma almeno il codice sopra dovrebbe aiutare gli altri che cercano di capire come fare.
Vedi il codice sorgente qui per ulteriore ispirazione (hanno optato per l'uso di jQuery per spostare il "sottotitolo").

Nel caso possa essere utile a qualcuno che sta seguendo lo stesso percorso: ho posto una domanda qui che contiene codice correlato/simile (ho scelto di utilizzare il campo "title" per contenere e filtrare il sottotitolo).

Invece di spostare tutto nella sezione avanzata in cima, perché non creare una nuova sezione e posizionarla in alto:
// Crea una sezione 'top' e posizionala in cima
add_action('edit_form_after_title', function() {
global $post, $wp_meta_boxes;
do_meta_boxes(get_current_screen(), 'top', $post);
unset($wp_meta_boxes[get_post_type($post)]['top']);
});
Ora tutto ciò che devi fare è registrare il meta box utilizzando top
per la sezione e high
per la priorità.
Funziona su WordPress 4.4.2 per me. Non ho testato questa soluzione su altre versioni di WP.

C'è un altro modo, possiamo posizionare l'editor in qualsiasi posizione:
Rimuovi l'editor dal parametro support quando registri il post_type
Aggiungi un metabox fittizio
add_meta_box( 'does-not-matter', __( 'Descrizione'), function($post){ wp_editor($post->post_content,'post_content',array('name'=>'post_content')); }, 'post_type_type', 'advanced', 'high' );
