我已经扩展了一点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\'));