WordPress开发似乎正在建立一个关于最佳功能的知识库。非常感谢这已经帮了大忙了!
我找到了一个函数(在下面找到),它在一个框中为wordpress主题的每一页提供了一个简单的菜单决定。一个神奇的袋子戏法,向彼得·普费弗致敬!
但如何在子标题菜单-主题位置中更改子标题菜单,而不是页面上的所有菜单都是胡说八道。
当函数返回$args时,我想知道如何告诉Wp我只想让他们更改子标题菜单位置中的菜单。你有什么想法或其他功能,会很大!
/**
* Erstellt eine Meta Box um einer Seite ein eigenes Menü mit zu geben.
* Die Menüs müssen unter Design -> Menü definiert sein.
*
* @author H.-Peter Pfeufer
*/
if(!class_exists(\'Page_Menu_Meta_Box\')) {
class Page_Menu_Meta_Box {
private $textdomain = \'meine-textdomain\'; // Textdomain für die Übersetzung
private $posttype = \'page\'; // Posttype (hier page für Seiten)
private $metaname = \'page_menu\'; // Name des Custom Fields
private $metaboxID = \'page_menu\'; // ID der Metabox
private $noncename = \'page_menu\'; // Name des Nonce (etwas für die Sicherheit
private $defaultmenu = \'default\'; // "Slug" des Standardmenüs
private $userright = \'edit_page\'; // Nutzerrechte die benötigt werden
private $selectname = \'page-menu\'; // Name des Selectferldes
/**
* Constructor (old style)
*
* @uses __construct
*/
function Page_Menu_Meta_Box() {
self::__construct();
} // END function Page_Menu_Meta_Box()
/**
* Constructor
*/
function __construct() {
// Backend
if(is_admin()) {
add_action(\'add_meta_boxes\', array(
&$this,
\'_add_meta_box\'
));
add_action(\'save_post\', array(
&$this,
\'_save_page_menu\'
));
} // END if(is_admin())
// Frontend
if(!is_admin()) {
add_filter(\'wp_nav_menu_args\', array(
&$this,
\'_menu_per_page\'
));
} // END if(!is_admin())
} // END function __construct()
/**
* Metabox am System anmelden
*/
function _add_meta_box() {
add_meta_box($this->metaboxID, __(\'Select the menu for this page\', $this->textdomain), array(
&$this,
\'the_meta_box\'
), $this->posttype, \'normal\', \'high\');
} // END function _add_meta_box()
/**
* Metabox erstellen
*/
function the_meta_box() {
global $post;
// Menüs abholen
$menues = wp_get_nav_menus();
if(!empty($menues) && count($menues) != 0) {
// Use nonce for verification
wp_nonce_field(plugin_basename( __FILE__ ), $this->noncename);
// Ist bereits ein Menü gewählt?
$menuslug = get_post_meta($post->ID, $this->metaname, true);
// Setting the defaultmenu
if(empty($menuslug)) {
$menuslug = $this->defaultmenu;
} // END if(empty($menu_name))
echo sprintf(\'<p>%1$s</p>\', __(\'Please select the menu which should be displayed on this page.\', $this->textdomain));
echo \'<select name="\' . $this->selectname . \'">\';
foreach($menues as $menu) {
if(!empty($menuslug)) {
$selected = \'\';
if($menuslug == $menu->slug) {
$selected = \' selected="selected"\';
} // END if($menu_name == $menu->slug)
} // END if(!empty($menu_name))
echo \'<option value="\' . $menu->slug . \'"\' . $selected . \'>\' . $menu->name . \'</option>\';
} // END foreach($menues as $menu)
echo \'</select>\';
} // END if(!empty($menues) && count($menues) != 0)
} // END function the_meta_box()
/**
* Daten speichern
*
* @param int $post_id
*/
function _save_page_menu($post_id) {
// Erst mal schauen wir, ob der Nutzer das überhaupt darf
if(!current_user_can($this->userright, $post_id)) {
return;
}
// Dann prüfen wir die Nonces
if(!isset($_REQUEST[$this->noncename]) || !wp_verify_nonce($_REQUEST[$this->noncename], plugin_basename(__FILE__))) {
return;
} // END if(!isset($_REQUEST[\'vokabel_page_menu\']) || !wp_verify_nonce($_REQUEST[\'vokabel_page_menu\'], plugin_basename(__FILE__)))
// und nun wird der ganze Hokuspokus gespeichert
$post_id = $_REQUEST[\'post_ID\'];
// Metainformationen hinzufügen oder aktualisieren
add_post_meta($post_id, $this->metaname, $_REQUEST[$this->selectname], true) or update_post_meta($post_id, $this->metaname, $_REQUEST[$this->selectname]);
} // END function _save_page_menu($post_id)
/**
* Menü im Frontend anzeigen
*
* @param array $args
* @return Ambigous <mixed, string, multitype:, boolean, array, string>
*/
function _menu_per_page($args = \'\') {
if(is_page()) {
global $post;
$menuslug = get_post_meta($post->ID, $this->metaname, true);
if(!empty($menuslug) && is_nav_menu($menuslug)) {
$args[\'menu\'] = $menuslug;
} // END if(!empty($menu_name) && is_nav_menu($menu_name))
} // END if(is_page())
return $args;
} // END function _menu_per_page($args = \'\')
} // END class Page_Menu_Meta_Box
// Klasse starten
new Page_Menu_Meta_Box();
} // END if(!class_exists(\'Page_Menu_Meta_Box\'))