Come posso inserire una casella meta personalizzata sopra l'editor ma sotto la sezione del titolo nella pagina di modifica del post?

15 dic 2011, 22:38:17
Visualizzazioni: 38.3K
Voti: 36

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?

1
Commenti

Domanda molto simile qui: http://wordpress.stackexchange.com/questions/35416/re-order-editor-to-be-after-meta-box

Simon East Simon East
29 ago 2014 04:53:08
Tutte le risposte alla domanda 5
3
58
  • 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']);
    });
    
23 feb 2013 20:48:37
Commenti

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

leemon leemon
28 ago 2016 21:57:31

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/

farinspace farinspace
8 dic 2017 23:41:59

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

Fanky Fanky
9 giu 2022 15:29:43
2
18

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');
20 ago 2014 07:49:43
Commenti

cambiare in qualcosa di diverso da normale, avanzato o laterale - è stato la chiave nel mio caso. Grazie per l'informazione.

Mayeenul Islam Mayeenul Islam
28 set 2014 12:39:50

Questa è stata la risposta più utile per me. Grazie!

marvinpoo marvinpoo
4 dic 2018 16:48:43
1
13

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:

  1. Renderlo OOP/con classe(i).
  2. 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").

7 mag 2013 04:04:46
Commenti

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

mhulse mhulse
21 mag 2013 03:14:14
0

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.

19 mar 2016 13:16:11
1

C'è un altro modo, possiamo posizionare l'editor in qualsiasi posizione:

  1. Rimuovi l'editor dal parametro support quando registri il post_type

  2. 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' );
    
26 mag 2016 13:03:13
Commenti

Per tua informazione, questa funzionalità funziona ancora, ma quando sposti la casella può causare comportamenti strani con il contenuto del campo. Attenzione utenti.

Eckstein Eckstein
12 feb 2018 06:19:32