web-dev-qa-db-fra.com

Comment ajouter une méta-boîte à la page du menu principal

Je dois ajouter un méta-boîte à la page du menu principal, dans Apparence-> Menus (/wp-admin/nav-menus.php), pour répertorier tous les types de publication, les valeurs par défaut et les personnalisées.

Il contiendra une liste contenant un lien vers les pages d'archives uniquement des types de publication respectifs à ajouter au menu de navigation. Est-ce possible?

3
Giraldi

Voici un exemple de metabox qui apparaît tout en haut à gauche dans l'interface des menus de navigation:

/**
 * Instantiates the class
 */
add_action( 'admin_init', array( 'call_someClass', 'init' ) );

/**
 * The Class
 */
class call_someClass {
    const LANG = 'exch_lang';

    public static function init() {
    $class = __CLASS__;
    new $class;
    }

    public function __construct() {
    // Abort if not on the nav-menus.php admin UI page - avoid adding elsewhere
    global $pagenow;
    if ( 'nav-menus.php' !== $pagenow )
                    return;

        $this->add_some_meta_box();
    }

    /**
     * Adds the meta box container
     */
    public function add_some_meta_box(){
        add_meta_box(
            'info_meta_box_'
            ,__( 'Example metabox', self::LANG )
            ,array( $this, 'render_meta_box_content' )
            ,'nav-menus' // important !!!
            ,'side' // important, only side seems to work!!!
            ,'high'
        );
    }

    /**
     * Render Meta Box content
     */
    public function render_meta_box_content() {
        echo '<p>Example text</p>';
    }
}

La partie importante de add_meta_box est:

            ,'nav-menus' // important !!!
            ,'side' // important, only side seems to work!!!

Il existe un type de message de menu de navigation, mais il ne prend pas en charge les métaboxes, et nav-menus.php est codé en dur pour utiliser les valeurs "nav-menus" et "side". Tant que vous respectez cela, vous pouvez faire tout ce que vous voulez, dans la mesure du raisonnable.

Malheureusement, ajouter des champs supplémentaires aux éléments de menu individuels eux-mêmes, par exemple. liens, pages, etc., n’est pas possible au moment de l’écriture, car ces champs sont codés en dur. Vous pouvez les ajouter via jQuery, puis les enregistrer via des points d'ancrage dans le backend si vous en avez besoin.

8
Tom J Nowell

Comme la méta-boîte a déjà été répondue par @TomJNowell, je vous montre seulement comment obtenir la liste des types de messages:

/**
 * Builds a html form element list depending on the param type
 * 
 * @param string $type | form element type; Valid: select/checkbox/radio
 * @param bool $echo | (optional) print or return
 * @return string $html
 */
public function get_post_types_list( $type, $echo = false )
{
    $name = ' name="nav-menu-post-types';
    $html = ! in_array( $type, array( 'checkbox', 'radio' ) ? "<{$type}{$name}'>" : '';
    foreach( array_keys( $GLOBALS['wp_post_types'] ) as $pt )
        $html .= 'select' === $type ? "<option>{$pt}</option>" : "<input type='{$type}' {$name}[]' value='{pt}' />";
    $html .= ! in_array( $type, array( 'checkbox', 'radio' ) ? "</{$type}>" : '';

    if ( $echo ) 
        return print $type;
    return $type;
}

Ce n'est pas testé, mais cela devrait fonctionner.

2
kaiser

Une alternative à la solution de @ kaiser est la fonction get_post_types(). Cela devrait vous permettre de contrôler un peu plus finement les types de publication.

1
mor7ifer