it-swarm.com.de

So fügen Sie der Backend-Menüseite eine Meta-Box hinzu

Ich muss ein Meta-Feld zur Backend-Menüseite hinzufügen, in Darstellung -> Menüs (/wp-admin/nav-menus.php), um alle verfügbaren Beitragstypen aufzulisten Standardeinstellungen und die benutzerdefinierten.

Es enthält eine Liste, die einen Link zu nur Archivseiten der jeweiligen Beitragstypen enthält, die dem Navigationsmenü hinzugefügt werden sollen. Ist das möglich?

3
Giraldi

Hier ist ein Beispiel für eine Metabox, die ganz oben links in der Benutzeroberfläche der Navigationsmenüs angezeigt wird:

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

Der wichtige Teil von add_meta_box ist:

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

Es gibt einen Navigationsmenü-Beitragstyp, der jedoch keine Metaboxen unterstützt, und die Datei nav-menus.php ist für die Verwendung der Werte 'nav-menus' und 'side' fest codiert. Solange Sie dies respektieren, können Sie im Rahmen der Vernunft alles tun, was Sie möchten.

Leider fügen Sie den einzelnen Menüelementen selbst zusätzliche Felder hinzu, z. Links, Seiten usw. sind zum Zeitpunkt des Schreibens nicht möglich, da diese Felder fest codiert sind. Sie können sie über jQuery hinzufügen und dann über Hooks im Backend speichern, wenn Sie sie benötigen.

8
Tom J Nowell

Da die Meta-Box bereits von @TomJNowell beantwortet wurde, zeige ich Ihnen nur, wie Sie die Liste der Beitragstypen erhalten:

/**
 * 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;
}

Es ist nicht getestet, aber es sollte funktionieren.

2
kaiser

Eine Alternative zu @ kaisers Lösung ist die Funktion get_post_types(). Es sollte Ihnen eine etwas genauere Kontrolle über die Beitragstypen ermöglichen.

1
mor7ifer