मैंने उस दृष्टिकोण के साथ अधिक उदारता प्रदान करने के लिए टंगड के उत्तर पर थोड़ा विस्तार किया है । यह कार्यान्वयन मेनू 'मैक्रोज़' और आंतरिक वर्डप्रेस 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'));