web-dev-qa-db-fra.com

Déplacer l'extrait pour toujours être directement sous le contenu de post dans admin

Parfois, en raison de boîtes de méta ajoutées par des plugins, l'extrait est déplacé dans l'ordre de la page d'administration.

Est-il possible de le forcer à toujours être directement sous le contenu de l'article?

Voici la façon dont j'ai essayé:

function remove_wordpress_meta_boxes() {
   remove_meta_box( 'postexcerpt', 'page', 'normal' );
   add_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', 'page', 'normal', 'high');
}
add_action( 'admin_menu', 'remove_wordpress_meta_boxes' );

remove_meta_box() fonctionne comme prévu, mais l'ajout de la boîte de méta-extraits ne semble pas avoir d'effet sur la commande. Il me reste un métabox de plug-in au-dessus de l'extrait.

3
iltdev

La raison pour laquelle votre code ne fonctionne pas est probablement que vous avez déjà commandé vos métaboxes et que cette commande a été enregistrée dans la méta-valeur meta-box-order_page. Cela remplace la configuration par défaut.

Voici un exemple de la méta valeur meta-box-order_post:

a:3:{
     s:4:"side";    
         s:61:"submitdiv,formatdiv,categorydiv,tagsdiv-post_tag,postimagediv";
     s:6:"normal";  
         s:96:"revisionsdiv,postexcerpt,trackbacksdiv,postcustom,
               commentstatusdiv,commentsdiv,slugdiv,authordiv";
     s:8:"advanced";
         s:0:"";
}

Ici, je viens de reformater le tableau sérialisé pour une meilleure lisibilité.

MetaBox collantes:

Pour déplacer une métabox donnée vers la position top , pour un contexte donné et post-type , vous pouvez utiliser cet extrait de code:

/**
 * Set some sticky metaboxes
 */

add_action( 'admin_init', function()
{
    if( function_exists( 'wpse_sticky_metabox' ) )
    {
         // Sticky metabox #1:
         wpse_sticky_metabox(
             array(
                 'cpt'      => 'page',
                 'context'  => 'normal',
                 'metabox'  => 'postexcerpt'
             )
         );

         // Sticky metabox #2:
         wpse_sticky_metabox(
             array(
                 'cpt'      => 'post',
                 'context'  => 'side',
                 'metabox'  => 'authordiv' 
             )
         );
    }
});

où vous pouvez adapter cela à vos besoins.

Quelques informations sur les paramètres d'entrée:

  • cpt est le type de publication personnalisé de l'écran de modification (c'est-à-dire post , page , ...)
  • context est la section où vous voulez rendre le métabox collant. (c'est-à-dire normal , latéral , avancé , ...)
  • metabox est le id de la méta-boîte adhésive (c'est-à-dire postexcerpt , authordiv , ...)

Sticky MetaBoxes - le plugin:

Ceci est supporté par le plugin démo suivant:

/**
 * Plugin Name: Sticky Meta-Boxes
 * Description: Set a given meta-box to the top, for a given cpt and context.
 * Plugin URI:  http://wordpress.stackexchange.com/a/174980/26350
 * Author:      Birgir Erlendsson (birgire)
 * Version:     0.0.2
 */

function wpse_sticky_metabox( $args = array() )
{
    if( class_exists( 'MetaBoxSticker' ) )
    {
        $o = new MetaBoxSticker;
        $o->setup( $args )->activate();
    }
}

class MetaBoxSticker
{
    private $args;

    public function setup( $args = array() )
    {
        $default = array(
            'cpt'      => 'post',
            'context'  => 'normal',
            'metabox'  => 'postexcerpt'
        );
        $this->args = wp_parse_args( $args, $default );
        return $this;
    }

    public function activate()
    {
        add_filter(
            sprintf(
                'get_user_option_meta-box-order_%s',
                $this->args['cpt']
            ),
            array( $this, 'filter' ),
            PHP_INT_MAX
        );

        add_action( 
            'add_meta_boxes', 
            array( $this, 'relocate' ), 
            PHP_INT_MAX 
        );
    }

    public function relocate()
    {
        //-----------------------
        // Get the user input:
        //-----------------------
        $_cpt      = sanitize_key( $this->args['cpt']     );
        $_metabox  = sanitize_key( $this->args['metabox'] );
        $_context  = sanitize_key( $this->args['context'] );

        //-----------------------
        // Relocate 'high' metaboxes to 'default' in the current context
        //-----------------------                  
        global $wp_meta_boxes;
        if( isset( $wp_meta_boxes[$_cpt][$_context]['high'] ) )
        {                                                           
            foreach( $wp_meta_boxes[$_cpt][$_context]['high'] as $id => $item )
            {
                if( isset( $item['callback'] ) )
                {
                    remove_meta_box( 
                        $id, 
                        $_cpt, 
                        $_context 
                    );

                    add_meta_box( 
                        $id, 
                        $item['title'], 
                        $item['callback'], 
                        $_cpt, 
                        $_context, 
                        'default', 
                        $item['args'] 
                    );
                }
            }
        }
    }

    public function filter( $order )
    {
        //-----------------------
        // Get the user input:
        //-----------------------                               
        $_cpt      = sanitize_key( $this->args['cpt']     );
        $_metabox  = sanitize_key( $this->args['metabox'] );
        $_context  = sanitize_key( $this->args['context'] );

        //-----------------------
        // Handle the case if the current user hasn't made any meta-box ordering before:
        //-----------------------
        if( empty( $order ) )
        {
            global $wp_meta_boxes;
            if( ! isset( $wp_meta_boxes[$_cpt][$_context] ) )
               return $order;

            $order = array();
            foreach( $wp_meta_boxes[$_cpt] as $context_key => $context_item )
            {
                $tmp = array();
                foreach( $context_item as $priority_key => $priority_item )
                {
                    foreach( $priority_item as $metabox_key => $metabox_item )
                    {
                        $tmp[] = $metabox_key;
                    }
                }
                $order[$context_key] = join( ',', $tmp );
            }
        }

        //-----------------------
        // Let's make sure the context exists:
        //-----------------------
        if( ! isset( $order[$_context] ) )
            return $order;

        //-----------------------
        // Remove the given meta-box from the whole order array:
        //-----------------------
        foreach( $order as $context_key => $string )
        {
            $tmp = explode( ',', $string );
            $key = array_search( $_metabox, $tmp );
            if( ! empty( $key ) )
            {
                unset( $tmp[$key] );
                $order[$context_key] = join( ',', $tmp );
            }
        }

        //-----------------------
        // Make the given meta-box sticky for a given context
        //-----------------------
        $tmp = explode( ',', $order[$_context] );
        array_unshift( $tmp, $_metabox );
        $order[$_context] = join( ',', $tmp );

        return $order;
    }

} // end class

Ce plugin devrait également fonctionner, même si vous n'avez jamais commandé auparavant.

Il respecte également les Options d’écran , c’est-à-dire qu’une méta-boîte est visible ou non.

J'espère que vous pourrez l'étendre davantage à vos besoins.

2
birgire

Comme indiqué, vous ne pouvez modifier que l'ordre par défaut. Si un utilisateur l'a modifié, vous ne pouvez pas effectuer beaucoup de choses sans écrire un script de réinitialisation.

Quoi qu'il en soit, voici comment vous modifiez correctement l'ordre par défaut, (disclaimer, j'ai écrit l'article) https://ozthegreat.io/wordpress/wordpress-how-to-move-the-excerpt-meta-box-above -the-editor/

/**
 * Removes the regular excerpt box. We're not getting rid
 * of it, we're just moving it above the wysiwyg editor
 *
 * @return null
 */
function oz_remove_normal_excerpt() {
    remove_meta_box( 'postexcerpt' , 'post' , 'normal' );
}
add_action( 'admin_menu' , 'oz_remove_normal_excerpt' );

/**
 * Add the excerpt meta box back in with a custom screen location
 *
 * @param  string $post_type
 * @return null
 */
function oz_add_excerpt_meta_box( $post_type ) {
    if ( in_array( $post_type, array( 'post', 'page' ) ) ) {
        add_meta_box(
            'oz_postexcerpt',
            __( 'Excerpt', 'thetab-theme' ),
            'post_excerpt_meta_box',
            $post_type,
            'after_title',
            'high'
        );
    }
}
add_action( 'add_meta_boxes', 'oz_add_excerpt_meta_box' );

/**
 * You can't actually add meta boxes after the title by default in WP so
 * we're being cheeky. We've registered our own meta box position
 * `after_title` onto which we've regiestered our new meta boxes and
 * are now calling them in the `edit_form_after_title` hook which is run
 * after the post tile box is displayed.
 *
 * @return null
 */
function oz_run_after_title_meta_boxes() {
    global $post, $wp_meta_boxes;
    # Output the `below_title` meta boxes:
    do_meta_boxes( get_current_screen(), 'after_title', $post );
}
add_action( 'edit_form_after_title', 'oz_run_after_title_meta_boxes' );
1
OzTheGreat