我已经扩展了一点tungd\'s answer 为该方法提供更多通用性。此实现允许在菜单“宏”和内部Wordpress URL之间添加只有后端知道的任意映射。
我还决定使用! 作为这些宏的前缀,以避免它们与命名锚冲突-这包括从链接URL中去除“http://”的开销(因为Wordpress将尝试正常化这些奇怪的链接)。如果该实现让您感到困扰,您可以随时删除preg_replace() 呼叫和使用# 像以前一样作为链接前缀。
class Extendable_Menu_Walker extends Walker_Nav_Menu
{
    protected static $custom_urls = array();
    public static function setupUrls()
    {
        // calls to self::mapPostType($postTypeName) and 
        // self::createMapping($wildcard, $url) go here...
    }
    public function start_el(&$output, $item, $depth=0, $args=array(), $id=0)
    {
        $url = preg_replace(\'@^https?://@\', \'\', $item->url);
        if (isset( self::$custom_urls[ $url ] )) {
            $item->url = self::$custom_urls[ $url ];
        }
        parent::start_el($output, $item, $depth, $args, $id);
    }
    public static function createMapping($urlKey, $realUrl)
    {
        self::$custom_urls[\'!\' . $urlKey] = $realUrl;
    }
    public static function mapPostType($type)
    {
        self::createMapping(\'post_type_\' . $type, get_post_type_archive_link($type));
    }
}
add_action(\'init\', array(\'Extendable_Menu_Walker\', \'setupUrls\'));