我做了一切写在第一个答案:
>在function.PHP中包含该函数
>添加’walker’=> header.PHP文件上的新CustomLinkModifierWalker().
>将导航菜单的名称更改为<! - - :en- - > HOME<! - - : - ><! - - :gr- - >ΑΡΧΙΚΗ<! - - : - - ;和url到/ en | en | / | gr |
但是,翻译不起作用.该菜单显示导航中的字符串,如HOMEΑΡΧΙΚΗ,链接为/ en | en | / | gr |.
我究竟做错了什么?还是有另一种方式来翻译菜单?
在wordpress 4.0.1下
UPDATE
将名称更改为[:en] HOME [:el]ΑΡΧΙΚΗ没有上述代码使翻译工作,但我仍然无法使URL工作.
更新2
希腊语:
<ul class="menu" id="nav-menu"> <li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-1091"><a href="/">ΑΡΧΙΚΗ</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-1092"><a href="/#our-company">ΣΧΕΤΙΚΑ</a></li> </ul>
英文:
<ul class="menu" id="nav-menu"> <li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-1091"><a href="/">HOME</a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-1092"><a href="/#our-company">ABOUT</a></li> </ul>
更新3
[:EN] http://www.mydomain.gr/en [:EL] http://www.mydomain.gr
但是点击“保存按钮”后,url输入为空.它不保存url路径.
更新4
我添加的代码在functions.PHP和header.PHP的行.现在我有一个可选的URL在管理页面上.所以,我删除了URL并添加了可选如下:
< – :烯 – > / EN< – : – >< – :EL – > /< – : – >
<?PHP $defaults = array( 'theme_location' => 'other','container' => '','echo' => true,'fallback_cb' => 'wp_page_menu','before' => '','after' => '','link_before' => '','link_after' => '','items_wrap' => '<ul id="nav-menu" class="%2$s">%3$s</ul>','depth' => 0,'walker' => '' ); wp_nav_menu( $defaults ); wp_nav_menu( array( 'theme_location' => 'primary','menu_class' => 'nav-menu','walker' => new qTranslate_Menu_Walker() ) ); ?> </div>
问题是,这种格式的链接:/ en /#about的作品,但这种格式的链接/ en / blog不起作用,并重定向到默认语言.
所以记住这一点,我来了一个解决方案,使用一个额外的字段称为可选URL,如果此字段填充的东西(未过滤的内容)比wordpress将使用而不是URL字段,因为它通常.
所以在你的functions.PHP在最底层请放置这个代码,或者你可以把它放在另一个脚本,并将其包括在函数上:
//Return the custom Meta function um_add_optional_url( $menu_item ) { $menu_item->optional_url = get_post_meta( $menu_item->ID,'_menu_item_optional_url',true ); return $menu_item; } add_filter( 'wp_setup_nav_menu_item','um_add_optional_url' ); //Update and save the optional url function um_update_optional_url( $menu_id,$menu_item_db_id,$args ) { if ( is_array( $_REQUEST['menu-item-optional-url']) ) { $subtitle_value = $_REQUEST['menu-item-optional-url'][$menu_item_db_id]; update_post_Meta( $menu_item_db_id,$subtitle_value ); } } add_action( 'wp_update_nav_menu_item','um_update_optional_url',10,3 ); //Custom Menu Walker to get the stored values class qTranslate_Menu_Walker extends Walker { /** * What the class handles. * * @see Walker::$tree_type * @since 3.0.0 * @var string */ public $tree_type = array( 'post_type','taxonomy','custom' ); /** * Database fields to use. * * @see Walker::$db_fields * @since 3.0.0 * @todo Decouple this. * @var array */ public $db_fields = array( 'parent' => 'menu_item_parent','id' => 'db_id' ); /** * Starts the list before the elements are added. * * @see Walker::start_lvl() * * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of arguments. @see wp_nav_menu() */ public function start_lvl( &$output,$depth = 0,$args = array() ) { $indent = str_repeat("\t",$depth); $output .= "\n$indent<ul class=\"sub-menu\">\n"; } /** * Ends the list of after the elements are added. * * @see Walker::end_lvl() * * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of arguments. @see wp_nav_menu() */ public function end_lvl( &$output,$depth); $output .= "$indent</ul>\n"; } /** * Start the element output. * * @see Walker::start_el() * * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of arguments. @see wp_nav_menu() * @param int $id Current item ID. */ public function start_el( &$output,$item,$args = array(),$id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t",$depth ) : ''; $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; /** * Filter the CSS class(es) applied to a menu item's list item element. * * @since 3.0.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $classes The CSS classes that are applied to the menu item's `<li>` element. * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ $class_names = join( ' ',apply_filters( 'nav_menu_css_class',array_filter( $classes ),$args,$depth ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; /** * Filter the ID applied to a menu item's list item element. * * @since 3.0.1 * @since 4.1.0 The `$depth` parameter was added. * * @param string $menu_id The ID that is applied to the menu item's `<li>` element. * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ $id = apply_filters( 'nav_menu_item_id','menu-item-'. $item->ID,$depth ); $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; $output .= $indent . '<li' . $id . $class_names .'>'; $atts = array(); $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; $atts['target'] = ! empty( $item->target ) ? $item->target : ''; $atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : ''; $atts['href'] = ! empty( $item->url ) ? $item->url : ''; /** * Filter the HTML attributes applied to a menu item's anchor element. * * @since 3.6.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $atts { * The HTML attributes applied to the menu item's `<a>` element,empty strings are ignored. * * @type string $title Title attribute. * @type string $target Target attribute. * @type string $rel The rel attribute. * @type string $href The href attribute. * } * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ $atts = apply_filters( 'nav_menu_link_attributes',$atts,$depth ); $attributes = ''; foreach ( $atts as $attr => $value ) { if ( ! empty( $value ) ) { $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); //Inject the optional URL in case it exists and the attribute is href if('href' === $attr){ if(property_exists($item,'optional_url') && $item->optional_url){ $value = __($item->optional_url); } } $attributes .= ' ' . $attr . '="' . $value . '"'; } } $item_output = $args->before; $item_output .= '<a'. $attributes .'>'; //$item_output .= property_exists($item,'optional_url') ? $item->optional_url : "no"; /** This filter is documented in wp-includes/post-template.PHP */ $item_output .= $args->link_before . apply_filters( 'the_title',$item->title,$item->ID ) . $args->link_after; $item_output .= '</a>'; $item_output .= $args->after; /** * Filter a menu item's starting output. * * The menu item's starting output only includes `$args->before`,the opening `<a>`,* the menu item's title,the closing `</a>`,and `$args->after`. Currently,there is * no filter for modifying the opening and closing `<li>` for a menu item. * * @since 3.0.0 * * @param string $item_output The menu item's starting HTML output. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of {@see wp_nav_menu()} arguments. */ $output .= apply_filters( 'walker_nav_menu_start_el',$item_output,$depth,$args ); } /** * Ends the element output,if needed. * * @see Walker::end_el() * * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Page data object. Not used. * @param int $depth Depth of page. Not Used. * @param array $args An array of arguments. @see wp_nav_menu() */ public function end_el( &$output,$args = array() ) { $output .= "</li>\n"; } } // Walker_Nav_Menu //Custom Walker on edit screen add_filter( 'wp_edit_nav_menu_walker','custom_nav_edit_walker',2 ); function custom_nav_edit_walker($walker,$menu_id) { return 'Walker_Nav_Menu_Edit_Custom'; } class Walker_Nav_Menu_Edit_Custom extends Walker_Nav_Menu { /** * @see Walker_Nav_Menu::start_lvl() * @since 3.0.0 * * @param string $output Passed by reference. */ function start_lvl( &$output,$args = array() ) { $indent = str_repeat("\t",$depth); $output .= "\n$indent<ul class=\"sub-menu\">\n"; } /** * @see Walker_Nav_Menu::end_lvl() * @since 3.0.0 * * @param string $output Passed by reference. */ function end_lvl( &$output,$depth); $output .= "$indent</ul>\n"; } /** * @see Walker::start_el() * @since 3.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param object $args */ function start_el( &$output,$id = 0 ) { global $_wp_nav_menu_max_depth; $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth; $indent = ( $depth ) ? str_repeat( "\t",$depth ) : ''; ob_start(); $item_id = esc_attr( $item->ID ); $removed_args = array( 'action','customlink-tab','edit-menu-item','menu-item','page-tab','_wpnonce',); $original_title = ''; if ( 'taxonomy' == $item->type ) { $original_title = get_term_field( 'name',$item->object_id,$item->object,'raw' ); if ( is_wp_error( $original_title ) ) $original_title = false; } elseif ( 'post_type' == $item->type ) { $original_object = get_post( $item->object_id ); $original_title = $original_object->post_title; } $classes = array( 'menu-item menu-item-depth-' . $depth,'menu-item-' . esc_attr( $item->object ),'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),); $title = $item->title; if ( ! empty( $item->_invalid ) ) { $classes[] = 'menu-item-invalid'; /* translators: %s: title of menu item which is invalid */ $title = sprintf( __( '%s (Invalid)' ),$item->title ); } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) { $classes[] = 'pending'; /* translators: %s: title of menu item in draft status */ $title = sprintf( __('%s (Pending)'),$item->title ); } $title = empty( $item->label ) ? $title : $item->label; ?> <li id="menu-item-<?PHP echo $item_id; ?>" class="<?PHP echo implode(' ',$classes ); ?>"> <dl class="menu-item-bar"> <dt class="menu-item-handle"> <span class="item-title"><?PHP echo esc_html( $title ); ?></span> <span class="item-controls"> <span class="item-type"><?PHP echo esc_html( $item->type_label ); ?></span> <span class="item-order hide-if-js"> <a href="<?PHP echo wp_nonce_url( add_query_arg( array( 'action' => 'move-up-menu-item','menu-item' => $item_id,),remove_query_arg($removed_args,admin_url( 'nav-menus.PHP' ) ) ),'move-menu_item' ); ?>" class="item-move-up"><abbr title="<?PHP esc_attr_e('Move up'); ?>">↑</abbr></a> | <a href="<?PHP echo wp_nonce_url( add_query_arg( array( 'action' => 'move-down-menu-item','move-menu_item' ); ?>" class="item-move-down"><abbr title="<?PHP esc_attr_e('Move down'); ?>">↓</abbr></a> </span> <a class="item-edit" id="edit-<?PHP echo $item_id; ?>" title="<?PHP esc_attr_e('Edit Menu Item'); ?>" href="<?PHP echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.PHP' ) : add_query_arg( 'edit-menu-item',$item_id,remove_query_arg( $removed_args,admin_url( 'nav-menus.PHP#menu-item-settings-' . $item_id ) ) ); ?>"><?PHP _e( 'Edit Menu Item' ); ?></a> </span> </dt> </dl> <div class="menu-item-settings" id="menu-item-settings-<?PHP echo $item_id; ?>"> <?PHP if( 'custom' == $item->type ) : ?> <p class="field-url description description-wide"> <label for="edit-menu-item-url-<?PHP echo $item_id; ?>"> <?PHP _e( 'URL' ); ?><br /> <input type="text" id="edit-menu-item-url-<?PHP echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->url ); ?>" /> </label> </p> <?PHP endif; ?> <p class="description description-thin"> <label for="edit-menu-item-title-<?PHP echo $item_id; ?>"> <?PHP _e( 'Navigation Label' ); ?><br /> <input type="text" id="edit-menu-item-title-<?PHP echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->title ); ?>" /> </label> </p> <p class="description description-thin"> <label for="edit-menu-item-attr-title-<?PHP echo $item_id; ?>"> <?PHP _e( 'Title Attribute' ); ?><br /> <input type="text" id="edit-menu-item-attr-title-<?PHP echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->post_excerpt ); ?>" /> </label> </p> <p class="field-link-target description"> <label for="edit-menu-item-target-<?PHP echo $item_id; ?>"> <input type="checkBox" id="edit-menu-item-target-<?PHP echo $item_id; ?>" value="_blank" name="menu-item-target[<?PHP echo $item_id; ?>]"<?PHP checked( $item->target,'_blank' ); ?> /> <?PHP _e( 'Open link in a new window/tab' ); ?> </label> </p> <p class="field-css-classes description description-thin"> <label for="edit-menu-item-classes-<?PHP echo $item_id; ?>"> <?PHP _e( 'CSS Classes (optional)' ); ?><br /> <input type="text" id="edit-menu-item-classes-<?PHP echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( implode(' ',$item->classes ) ); ?>" /> </label> </p> <p class="field-xfn description description-thin"> <label for="edit-menu-item-xfn-<?PHP echo $item_id; ?>"> <?PHP _e( 'Link Relationship (XFN)' ); ?><br /> <input type="text" id="edit-menu-item-xfn-<?PHP echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->xfn ); ?>" /> </label> </p> <p class="field-description description description-wide"> <label for="edit-menu-item-description-<?PHP echo $item_id; ?>"> <?PHP _e( 'Description' ); ?><br /> <textarea id="edit-menu-item-description-<?PHP echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?PHP echo $item_id; ?>]"><?PHP echo esc_html( $item->description ); // textarea_escaped ?></textarea> <span class="description"><?PHP _e('The description will be displayed in the menu if the current theme supports it.'); ?></span> </label> </p> <?PHP /* * This is the added field */ if($item->type == 'custom'): ?> <p class="field-custom description description-wide"> <label for="edit-menu-item-custom-<?PHP echo $item_id; ?>"> <?PHP _e( 'Optional URL' ); ?><br /> <input type="text" id="edit-menu-item-custom-<?PHP echo $item_id; ?>" class="widefat code edit-menu-item-custom" name="menu-item-optional-url[<?PHP echo $item_id; ?>]" value="<?PHP echo $item->optional_url; ?>" /> <span class="description">Place an URL to use instead of the original one,while this one does not strip tags (stays unfiltered)</span> </label> </p> <?PHP endif; /* * end added field */ ?> <div class="menu-item-actions description-wide submitBox"> <?PHP if( 'custom' != $item->type && $original_title !== false ) : ?> <p class="link-to-original"> <?PHP printf( __('Original: %s'),'<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' ); ?> </p> <?PHP endif; ?> <a class="item-delete submitdelete deletion" id="delete-<?PHP echo $item_id; ?>" href="<?PHP echo wp_nonce_url( add_query_arg( array( 'action' => 'delete-menu-item',admin_url( 'nav-menus.PHP' ) ) ),'delete-menu_item_' . $item_id ); ?>"><?PHP _e('Remove'); ?></a> <span class="Meta-sep"> | </span> <a class="item-cancel submitcancel" id="cancel-<?PHP echo $item_id; ?>" href="<?PHP echo esc_url( add_query_arg( array('edit-menu-item' => $item_id,'cancel' => time()),admin_url( 'nav-menus.PHP' ) ) ) ); ?>#menu-item-settings-<?PHP echo $item_id; ?>"><?PHP _e('Cancel'); ?></a> </div> <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?PHP echo $item_id; ?>]" value="<?PHP echo $item_id; ?>" /> <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->object_id ); ?>" /> <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->object ); ?>" /> <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->menu_item_parent ); ?>" /> <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->menu_order ); ?>" /> <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?PHP echo $item_id; ?>]" value="<?PHP echo esc_attr( $item->type ); ?>" /> </div><!-- .menu-item-settings--> <ul class="menu-item-transport"></ul> <?PHP $output .= ob_get_clean(); } }
比编辑你的header.PHP或无论你在哪里调用wp_nav_menu函数,并传递这个新的步行者作为一个参数:
wp_nav_menu( array( 'theme_location' => 'primary','walker' => new qTranslate_Menu_Walker() ) );
其中qTranslate_Menu_Walker是用可选URL替换URL的新Walker
PS:使用<! - :en - >这些语言标签代替<! - : - >