Tôi đã mở rộng một chút về câu trả lời của tungd để cung cấp sự hào phóng hơn với cách tiếp cận đó. Việc triển khai này cho phép thêm ánh xạ tùy ý giữa các menu 'macro' và URL Wordpress nội bộ mà chỉ phụ trợ mới biết.
Tôi cũng đã quyết định sử dụng !
làm tiền tố cho các macro này để tránh chúng xung đột với các neo được đặt tên - điều này bao gồm một chi phí để loại bỏ 'http: //' khỏi URL liên kết (vì Wordpress sẽ cố gắng bình thường hóa các liên kết kỳ lạ này) . Nếu việc triển khai đó làm phiền bạn, bạn luôn có thể xóa preg_replace()
cuộc gọi và sử dụng #
làm tiền tố liên kết của mình như trước.
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'));