it-swarm.com.de

Wie greife ich auf die Menüs zu, die unter Dashboard> Darstellung> Menüs erstellt wurden?

Eine Fortsetzung dieser Frage:

Ersetzen der WordPress-Menüfunktionen durch ein Plugin

Da ich wirklich selten mit WordPress arbeite (ich habe viel mit phpBB, myBB, Concrete5 und benutzerdefinierten PHP Skripten gearbeitet - aber meine WordPress-Erfahrung ist auf eine oder zwei einfache Sites beschränkt), habe ich das gefühlt Möglicherweise erhalte ich hier eine schnellere Antwort, als 3 Stunden in der Dokumentation zu verbringen.

Ich erstelle ein Plugin, um das WordPress-Menü durch mein eigenes zu ersetzen. Bisher ist hier der Code für dieses Plugin (alles in einer einzigen PHP Datei):

add_action('init', 'DEMenu::init');
class DEMenu {

    public static function init() {
        $DEMenu = new DEMenu();
        load_plugin_textdomain ('de-menu', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/');
        /* Load CSS with wp_enqueue_style() */

        // If in admin page, then load admin page stuff
        if (is_admin()) {
            add_action('admin_menu', 'DEMenu::admin');
        }   
        // If not on admin page ...
        else {
            // Load plugin core - doesn't require a hook
            $DEMenu->core();
        }

    }

    public static function admin() {
        add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu', 'DEMenu::options');
//      add_option('de_menu_maintenance', 'off');
    }

    public static function options() {
        if (!current_user_can('manage_options'))  {
            wp_die( __('You do not have sufficient permissions to access this page.') );
        }
        echo '<div class="wrap">';
        echo '<p>Here is where the form would go if I actually had options.</p>';
        echo '</div>';
    }

    public static function core() {

        /* Add support for various themes */
        add_filter('wp_nav_menu', 'DEMenu::display');

        /* If I need to add more actions/filters they will go here... I may enqueue CSS here, too */

    }

    public static function display() {
        print "Let's see if this displays. I'll add some text to ctrl+F for later";
    }

}

Dies ist hauptsächlich der Höhepunkt verschiedener Ratschläge aus der WordPress-Dokumentation, den Lernprogrammen für die Plug-in-Entwicklung und den grundlegenden OOP Praktiken.

Jetzt muss ich das Menü im Bereich Dashboard> Darstellung> Menüs zeichnen. Wie kann ich auf dieses Menüobjekt (als Array oder als anderen zugänglichen Datentyp) zugreifen, damit ich damit arbeiten kann?

Und mir ist klar, dass es dumm erscheint, die Ausgabe von wp_nav_menu() vollständig zu überschreiben, wenn ich nur dasselbe Menü verwende. Ich kann mir jedoch keinen anderen Weg vorstellen, um das zu erreichen, was ich will.

BEARBEITEN -

Ich habe wp-includes/nav-menu-template.php gelesen, um zu erfahren, wie wp_nav_menu() die Liste der Menüelemente abruft und wie sie angezeigt wird. Ich habe versucht, die von dieser Funktion verwendete Methode im Wesentlichen nur mit geringfügigen Abweichungen zu emulieren, um sie in die Mehrspaltenstruktur einzufügen. Folgendes habe ich bisher:

public static function core() {

    /* Add support for varoius themes */
    add_filter('wp_nav_menu', 'DEMenu::display', 1);

    /* If I need to add more actions/filters they will go here... I may enqueue CSS here, too */

}

    public static function display( $args ) {
        /* The following is blatantly ripped from nav-menu-template.php */

            // *****************************************************************
            /* Excluded for ease of reading - this is an exact copy of nav-menu-template.php */
            // *****************************************************************

        // Here we can invoke our custom walker without editing the theme
        $args->walker = 'DEMenu_Walker';

            $items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );
            unset($sorted_menu_items);

            // *****************************************************************
            /* Excluded for ease of reading - this is an exact copy of nav-menu-template.php */
            // *****************************************************************

//          $nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args );
//  
//          if ( $args->echo )
//                  echo $nav_menu;
//          else
//                  return $nav_menu;

        // Rather than checking if we should echo the output, just return it.
        // This is a filter, so the output will be echo'd by the calling function
        return $nav_menu;
    }

Dann später (außerhalb der DEMenu-Klasse):

class DEMenu_Walker Extends Walker_Nav_Menu {

    function __construct() {
        die("We made it to the constructor!");
    }

}

Ich erhalte jedoch den folgenden Fehler:

Warning: Attempt to assign property of non-object in /home/coupon/public_html/wp-content/plugins/DE-menu/index.php on line 146

Diese Zeilennummer bezieht sich auf:

$args->walker = 'DEMenu_Walker';

Möglicherweise gibt es eine weitaus vernünftigere Lösung, die ich mir angesehen habe. Nach allem, was ich sagen kann, benötige ich jedoch eine benutzerdefinierte Walker-Klasse (zusammen mit privaten Variablen, um nachzuverfolgen, wie viele Elemente angezeigt wurden und wie viele Elemente pro angezeigt werden sollen) Dies ist die einzige Möglichkeit, eine benutzerdefinierte Walker-Klasse zu verwenden, ohne das Thema zu bearbeiten. Wenn ich jedoch die Lösung verwenden möchte, an der ich gerade arbeite, muss ich verstehen, warum die Variablen $args kein Objekt sind, wenn wp_nav_menu() am Anfang der Funktion eindeutig die folgende Codezeile enthält:

$args = (object) $args;

EINE ANDERE BEARBEITUNG -

Ich habe das Nicht-Objekt-Problem gelöst. Wenn wp_nav_menu() den Filter aufruft, heißt das so:

$nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args );

Mir war nicht klar, dass dies bedeutete, dass es sich um zwei Argumente handelte. Ich habe die Anzeigefunktion folgendermaßen geändert:

public static function display( $nav_menu, $args ){

Und natürlich änderte sich der Aufruf von add_filter() wie folgt:

add_filter( 'wp_nav_menu', 'DEMenu::display', 1, 2 );

Obwohl ich jetzt alle möglichen lustigen neuen Fehler bekomme.

Fatal error: Using $this when not in object context in /home/coupon/public_html/wp-includes/class-wp-walker.php on line 185

Wohlgemerkt, ich habe absolut keine Änderungen am WordPress-Kern vorgenommen, daher verstehe ich nicht, warum es einen Fehler in class-wp-walker.php gibt. Ich verstehe auch nicht, warum dieser Fehler gerade angezeigt wird. Irgendwelche Ideen?

FINAL EDIT -

Mit Hilfe von https://stackoverflow.com/questions/6862887/replacing-wordpress-core-functionality-with-a-plugin habe ich es endlich realisiert dass ich den wp_nav_menu_args-Filter verwenden kann, um meine eigene Gehklasse zu übergeben, ohne die gesamte Funktion wp_nav_menu() zu kopieren. Ich werde diese Lösung verwenden (um dieses Problem zu lösen), obwohl ich, wie oben erwähnt, ein neues Problem habe, bei dem meine Walker-Klasse verursacht, dass die übergeordnete Klasse einen schwerwiegenden Fehler auslöst. Ich werde dafür eine neue Frage stellen, da es ein Problem mit der Walker-Klasse ist und nicht mit dem Zugriff auf Menüelemente oder dem Übergeben eines benutzerdefinierten Walkers.


Aufgabe: Ich muss jedes Untermenü (zweite Ebene oder niedriger) in 5 Spalten unterteilen (entweder 5 separate <ul>-Elemente oder <div>-Elemente, die um bestimmte <li>-Elemente gewickelt sind).

1
stevendesu

Zuerst: Verwenden Sie für options() das Einstellungs-API ( Tutorial ).

Zweitens: Schauen Sie sich die Kernfunktion und die verfügbaren Filter an. Dann schauen Sie sich die verfügbaren Filter an:

$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );
$items = apply_filters( 'wp_nav_menu_items', $items, $args );
$items = apply_filters( "wp_nav_menu_{$menu->slug}_items", $items, $args );
0
kaiser