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


Risposte:


51
  • Aggiungi semplicemente una meta-box usando il contesto avanzato e l' alta priorità
  • Quindi, agganciare il edit_form_after_titlegancio
  • Stampa le tue meta box là fuori, quindi rimuovile in modo che non appaia due volte.

    // Move all "advanced" metaboxes above the default editor
    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 alcuni metabox usando il register_meta_box_cbparametro della register_post_typefunzione. Ho provato il tuo codice ma i metabox non si spostano sopra l'editor. Questo può essere usato nel mio caso? Grazie
leemon il

Consiglierei di usare un custom $context, invece di advancedusare qualcosa di simile my_before_editor, in modo da non spostare tutte le meta box nel advancedcontesto, in modo specifico come target le tue meta box specifiche .. vedi developer.wordpress.org/reference/functions/add_meta_box
farinspace

14

Ecco come è possibile spostare specifiche meta box sopra l'editor, ma prima di pubblicare il codice vorrei solo ringraziare Andrew e mhulse. Ragazzi, rock!

function foo_deck( $post_type ) {
    if ( in_array( $post_type, array( 'post', 'page' ) ) ) {
        add_meta_box(
            'contact_details_meta',
            'Contact Details',
            'contact_details_meta',
            $post_type,
            'test', // change to something other then normal, advanced or side
            'high'
        );
    }
}

add_action('add_meta_boxes', 'foo_deck');

function foo_move_deck() {
        # Get the globals:
        global $post, $wp_meta_boxes;

        # Output the "advanced" meta boxes:
        do_meta_boxes( get_current_screen(), 'test', $post );

        # Remove the initial "advanced" meta boxes:
        unset($wp_meta_boxes['post']['test']);
    }

add_action('edit_form_after_title', 'foo_move_deck');

1
change to something other then normal, advanced or side-è stata la chiave nel mio caso. Grazie per le informazioni.
Mayeenul Islam,

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

12

Per fornire un esempio di codice completo basato sulla risposta di Andrew ... Avevo bisogno di un modo per includere un "Deck" (aka sottotitolo) nei miei post; Volevo che il campo del mazzo venisse visualizzato dopo la barra del titolo principale.

/**
 * Add a "deck" (aka subhead) meta box to post page(s) and position it
 * under the title.
 *
 * @todo Move to class.
 * @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
 */

# Adds a box to the main column on the Post and Page edit screens:
function foo_deck($post_type) {

    # Allowed post types to show meta box:
    $post_types = array('post', 'page');

    if (in_array($post_type, $post_types)) {

        # Add a meta box to the administrative interface:
        add_meta_box(
            'foo-deck-meta-box', // HTML 'id' attribute of the edit screen section.
            'Deck',              // Title of the edit screen section, visible to user.
            'foo_deck_meta_box', // Function that prints out the HTML for the edit screen section.
            $post_type,          // The type of Write screen on which to show the edit screen section.
            'advanced',          // The part of the page where the edit screen section should be shown.
            'high'               // The priority within the context where the boxes should show.
        );

    }

}

# Callback that prints the box content:
function foo_deck_meta_box($post) {

    # Use `get_post_meta()` to retrieve an existing value from the database and use the value for the form:
    $deck = get_post_meta($post->ID, '_deck', true);

    # Form field to display:
    ?>

        <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

    # Display the nonce hidden form field:
    wp_nonce_field(
        plugin_basename(__FILE__), // Action name.
        'foo_deck_meta_box'        // Nonce name.
    );

}

/**
 * @see https://wordpress.stackexchange.com/a/16267/32387
 */

# Save our custom data when the post is saved:
function foo_deck_save_postdata($post_id) {

    # Is the current user is authorised to do this action?
    if ((($_POST['post_type'] === 'page') && current_user_can('edit_page', $post_id) || current_user_can('edit_post', $post_id))) { // If it's a page, OR, if it's a post, can the user edit it? 

        # Stop WP from clearing custom fields on autosave:
        if ((( ! defined('DOING_AUTOSAVE')) || ( ! DOING_AUTOSAVE)) && (( ! defined('DOING_AJAX')) || ( ! DOING_AJAX))) {

            # Nonce verification:
            if (wp_verify_nonce($_POST['foo_deck_meta_box'], plugin_basename(__FILE__))) {

                # Get the posted deck:
                $deck = sanitize_text_field($_POST['foo_deck']);

                # Add, update or delete?
                if ($deck !== '') {

                    # Deck exists, so add OR update it:
                    add_post_meta($post_id, '_deck', $deck, true) OR update_post_meta($post_id, '_deck', $deck);

                } else {

                    # Deck empty or removed:
                    delete_post_meta($post_id, '_deck');

                }

            }

        }

    }

}

# Get the 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));

}

# Display deck (this will feel better when OOP):
function foo_the_deck() {

    echo foo_get_deck(get_the_ID());

}

# Conditional checker:
function foo_has_subtitle($post_id = FALSE) {

    if (foo_get_deck($post_id)) return TRUE;

}

# Define the custom box:
add_action('add_meta_boxes', 'foo_deck');
# Do something with the data entered:
add_action('save_post', 'foo_deck_save_postdata');

/**
 * @see https://wordpress.stackexchange.com/questions/36600
 * @see https://wordpress.stackexchange.com/questions/94530/
 */

# Now move advanced meta boxes after the title:
function foo_move_deck() {

    # Get the globals:
    global $post, $wp_meta_boxes;

    # Output the "advanced" meta boxes:
    do_meta_boxes(get_current_screen(), 'advanced', $post);

    # Remove the initial "advanced" meta boxes:
    unset($wp_meta_boxes['post']['advanced']);

}

add_action('edit_form_after_title', 'foo_move_deck');

Ovviamente, il codice sopra potrebbe usare un po 'più di lavoro, ma dovrebbe aiutare gli altri a provare a fare le stesse cose (la risposta di Andrew ha illuminato la luce, ma ho pensato che potesse essere utile fornire effettivamente un esempio funzionante).

Questa risposta ha anche aiutato .

Miglioramenti che potrebbero essere apportati:

  1. Crea OOP / classi.
  2. Aggiungi stili / js per renderlo / sentire / comportarsi come il campo del titolo.

Ho intenzione di apportare i miglioramenti di cui sopra ad un certo punto in futuro, ma almeno il codice sopra dovrebbe aiutare gli altri a cercare di capirlo.

Vedi qui il codice sorgente per più ispirazione (hanno scelto di usare jQuery per spostare il "sottotitolo").


Nel caso in cui aiuti qualcuno a seguire lo stesso percorso: ho fatto una domanda qui che ha un codice correlato / simile (ho scelto di usare il campo "title" per contenere e filtrare il sottotitolo).
mhulse,

6

Invece di spostare tutto nella sezione avanzata in alto, perché non creare una nuova sezione e spostarla in alto:

// Create 'top' section and move that to the top
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 la meta box usando topper la sezione e highper la priorità.

Per me funziona su WordPress 4.4.2. Non l'ho provato su altre versioni di WP.


1

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

  1. Rimuovi l'editor dal parametro di supporto quando registri post_type

  2. aggiungi un falso metabox

    add_meta_box( 'does-not-matter', 
    __( 'Description'), 
    function($post){ 
      wp_editor($post->post_content,'post_content',array('name'=>'post_content'));
    },
    'post_type_type', 
    'advanced', 
    'high' );

Cordiali saluti, questo funziona ancora, ma quando si sposta la casella provoca uno strano comportamento con il contenuto del campo. Gli utenti attenti.
Eckstein,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.