¿Cómo puedo colocar un metacuadro personalizado encima del editor pero debajo de la sección del título en la página de publicación de edición?

30

Tengo un cuadro de meta personalizado para un tipo de publicación personalizado que mi cliente desea colocar entre la sección de título / enlace permanente y el editor de publicaciones en el panel de administración. ¿Es esto posible y si es así, hay un gancho / filtro / etc que necesitaría usar?

cstrouse
fuente
Pregunta muy similar aquí: wordpress.stackexchange.com/questions/35416/…
Simon East

Respuestas:

51
  • Simplemente agregue un meta cuadro usando el contexto avanzado y alta prioridad
  • Luego, asegúrate al edit_form_after_titlegancho
  • Imprima sus meta cuadros por ahí, luego quítelo para que no aparezca dos veces.

    // 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']);
    });
Andrés
fuente
Un sitio en el que estoy trabajando registra algunos metaboxes usando el register_meta_box_cbparámetro de la register_post_typefunción. He probado tu código pero los metaboxes no se mueven por encima del editor. ¿Se puede usar esto en mi caso? Gracias
leemon
Recomendaría usar un personalizado $context, en lugar de advancedusar algo como my_before_editor, para que no mueva todos los meta cuadros en el advancedcontexto, específicamente apunte a sus meta cuadros específicos. Vea developer.wordpress.org/reference/functions/add_meta_box
farinspace
14

Aquí es cómo puede mover meta cuadros específicos sobre el editor, pero antes de publicar el código solo me gustaría agradecer a Andrew y mhulse. ¡Ustedes molan!

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');
adamj
fuente
1
change to something other then normal, advanced or side-Fue la llave en mi caso. Gracias por la info.
Mayeenul Islam
Esta fue la respuesta más útil para mí. ¡Gracias!
marvinpoo
12

Para proporcionar un ejemplo de código completo basado en la respuesta de Andrew ... Necesitaba una forma de incluir un "Deck" (también conocido como subtítulo) en mis publicaciones; Quería que el campo del mazo apareciera después de la barra de título principal.

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

Obviamente, el código anterior podría usar un poco más de trabajo, pero debería ayudar a otros que intentan hacer lo mismo (la respuesta de Andrew fue clara, pero pensé que podría ser útil proporcionar un ejemplo de trabajo).

Esta respuesta también ayudó .

Mejoras que podrían hacerse:

  1. Hacer POO / clase (s).
  2. Agregue estilos / js para que se vea / sienta / se comporte como el campo de título.

Planeo hacer las mejoras anteriores en algún momento en el futuro, pero al menos el código anterior debería ayudar a otros que intentan resolver esto.

Consulte el código fuente aquí para obtener más inspiración (optaron por usar jQuery para mover el "subtítulo").

mhulse
fuente
En caso de que ayude a alguien a seguir el mismo camino: he hecho una pregunta aquí que tiene algún código relacionado / similar (opté por usar el campo "título" para mantener y filtrar el subtítulo).
mhulse
6

En lugar de mover todo en la sección avanzada a la parte superior, ¿por qué no crear una nueva sección y moverla a la parte superior?

// 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']);
});

Ahora todo lo que necesita hacer es registrar el meta cuadro usando topla sección y highla prioridad.

Está funcionando en WordPress 4.4.2 para mí. No he probado esto en otras versiones de WP.

titanic_fanatic
fuente
1

Hay otra manera, por cierto, podemos poner al editor en cualquier posición:

  1. Eliminar editor del parámetro de soporte cuando registre post_type

  2. agregar un metabox falso

    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' );
Hix.botay
fuente
Para su información, esto todavía funciona, pero cuando mueve el cuadro provoca un comportamiento extraño con el contenido del campo. Los usuarios tengan cuidado.
Eckstein