如何将自定义链接添加到具有相对于博客URL的URL的菜单

时间:2011-03-11 作者:Willington Vega

我的部分工作是创建Wordpress网站。我通常在我的笔记本电脑上工作,直到我有足够好的东西上传到测试服务器上,客户端在那里审查它。

我为每个新项目创建了一个VirtualHost,所以我总是在一个域中安装Wordpresshttp://local.example.com/, 但是当站点被上传到测试服务器(不是我控制的)时,域可能会变成这样http://testserver.com/arbitrary/path/example/.

问题是,如果我将自定义链接添加到指向的菜单,例如,/events/, 在本地创建指向http://local.example.com/events/, 但是在测试服务器中,链接将指向http://testserver/events/, 这显然是不对的
What I want is to give the custom link an URL that would work both on my local environment and the test server.

我已经处理了更改homesiteurl Wordpress选项作者:

更改本地数据库上的这些设置创建数据库转储更新服务器上的数据库还原本地选项我不想为自定义链接使用完整URL,每次需要更新服务器数据库时都必须用服务器URL替换这些URL。

对于帖子内容内的链接,有一个插件可以解决添加两个短代码的问题:http://wordpress.org/extend/plugins/url-shortcodes/, 但我还没有找到类似的自定义链接。

5 个回复
SO网友:Christian Hatz

我也在寻找解决方案,我找到了一个简单的解决方案。

这是您需要在URL字段中放置的内容:

/index.php/internal-site-name
enter image description here

它工作得很好!

最佳RegardsChris

SO网友:Milo

您可以使用nav_menu_link_attributes 过滤器,用于在输出每个菜单项之前检查和修改其href属性。

在本例中,我们查找以/, 在这种情况下,请在测试站点URL前面加上前缀:

function wpd_nav_menu_link_atts( $atts, $item, $args, $depth ){
    if( \'/\' == substr( $atts[\'href\'], 0, 1 ) ){
        $atts[\'href\'] = \'http://testserver.com/example\' . $atts[\'href\'];
    }
    return $atts;
}
add_filter( \'nav_menu_link_attributes\', \'wpd_nav_menu_link_atts\', 20, 4 );
您可以使用此代码创建一个简单的插件,并仅在测试服务器上激活它,或者创建某种标志,在测试站点环境存在时有条件地应用此过滤器。

SO网友:David Pacheco

Using <base href=" "> tag in the head meta 将为页面中的所有相对锚定提供一个基本url。

Reference:
https://www.w3.org/TR/html4/struct/links.html
12.4路径信息:基本元素

Relative custom links in wordpress:
如果希望站点url成为所有锚定的基本url,请将此添加到theme / header.php<head> :

<base href="<?php echo site_url(); ?>/">

<我知道你可能会迟到,但可以帮助别人

SO网友:user41251

在菜单设置中的自定义URL上,可以使用指向[blogurl]的相对链接。秘诀是用一个/. 当单个/启动自定义URL时,系统将不会预先设置典型的http:// 然后,将在执行时在目标URL中生成当前blogURL。

EXAMPLE
如果您想访问主页,只需/ 作为自定义URL

如果要转到文件夹中的索引页bbforums 然后放置/bbforums 作为自定义URL。

这允许您将站点移动到测试域,而无需在菜单的所有自定义链接中硬编码新的blogURL。

例如:
如果我的博客http://example.com 我想在子域中测试它http://test.example.com 使用上面提到的相对URL约定,可以在测试和生产之间移动站点,而不会出现菜单问题。我已经使用XCloner插件成功地测试了这种方法来移动站点。

SO网友:Manimaran

首先,您必须安装this plugin 用于URL短代码。

将此代码添加到functions.php 主题中的文件:

class description_walker extends Walker_Nav_Menu {
    function start_el( &$output, $item, $depth, $args ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';

        $class_names = $value = \'\';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;

        $class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) );
        $class_names = \' class="\'. esc_attr( $class_names ) . \'"\';

        $output .= $indent . \'<li id="menu-item-\'. $item->ID . \'"\' . $value . $class_names .\'>\';

        $attributes  = ! empty( $item->attr_title ) ? \' title="\'  . esc_attr( $item->attr_title ) . \'"\' : \'\';
        $attributes .= ! empty( $item->target )     ? \' target="\' . esc_attr( $item->target     ) . \'"\' : \'\';
        $attributes .= ! empty( $item->xfn )        ? \' rel="\'    . esc_attr( $item->xfn        ) . \'"\' : \'\';

        // echo $item->url;
        $string = explode( \'::\', $item->url, 3 );
        if ( $string[1] ) {
            $string[1] = str_replace( \'-\', \' \', $string[1] );
            $item->url = do_shortcode( "[$string[1]]" ); 
        }

        $attributes .= ! empty( $item->url )        ? \' href="\'   . esc_attr( $item->url        ) .\'"\' : \'\';

        $prepend = \'<strong>\';
        $append = \'</strong>\';
        $description  = ! empty( $item->description ) ? \'<span>\' . esc_attr( $item->description ) . \'</span>\' : \'\';

        if ( $depth != 0 ) {
            $description = $append = $prepend = "";
        }

        $item_output  = $args->before;
        $item_output .= \'<a\'. $attributes . \'>\';
        $item_output .= $args->link_before . $prepend . apply_filters( \'the_title\', $item->title, $item->ID ) . $append;
        $item_output .= $description . $args->link_after;
        $item_output .= \'</a>\';
        $item_output .= $args->after;

        $output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
    } 
}
那么你必须打电话给wp_nav_menu 模板文件中的函数:

$arg = array( 
    \'menu\'        => "main-menu", 
    \'echo\'        => true, 
    \'fallback_cb\' => \'wp_page_menu\', 
    \'depth\'       => 0, 
    \'walker\'      => new description_walker() 
); 
wp_nav_menu( $arg );
就是这样。然后转到后端菜单部分。

例如,如果我想将页面URL指定给自定义链接,我会这样添加它:

http://::blogurl-id=\'1302\'::
现在,您可以转到前端,检查短代码是否有效。

结束

相关推荐

Changing attachment urls?

如何更改附件页URL的格式/[post-url]/[attachment-name]/ 到/media/[attachment-name]/? 我知道我可以覆盖get_attachment_link 通过attachment_link 过滤器,但我想我需要更改重定向结构,以便WordPress知道如何处理这些URL?