如何使用与博客URL相关的URL向菜单添加自定义链接


16

我的工作之一是创建Wordpress网站。我通常在笔记本电脑上工作,直到有足够好的东西可以上传到客户端对其进行检查的测试服务器上为止。

我为每个新项目创建一个VirtualHost,因此我总是在外观类似的域中使用Wordpress安装http://local.example.com/,但是当站点上载到测试服务器(不受我控制)时,该域可能会像http://testserver.com/arbitrary/path/example/

问题是,如果我将自定义链接添加到指向例如的菜单/events/,则在本地创建到的链接会很好用http://local.example.com/events/,但是在测试服务器中,该链接将指向http://testserver/events/,这显然是不正确的。
我想要给自定义链接提供一个在我的本地环境和测试服务器上都可以使用的URL。

我已经通过以下方法解决了更改homesiteurlWordpress选项的问题:

  • 更改本地数据库上的那些设置
  • 创建数据库转储
  • 更新服务器上的数据库
  • 恢复本地选项。

我不想为自定义链接使用完整的URL,并且每次我需要更新服务器的数据库时都不必将其替换为服务器URL。

对于帖子内容中的链接,有一个插件可以解决此问题,添加了两个短代码:http ://wordpress.org/extend/plugins/url-shortcodes/ ,但是我无法为“自定义链接”找到类似的东西。


5
威灵顿,我无法帮助您找到在任何地方都可以使用的网址。我能做的就是将您指向spectacu.la/search-and-replace-for-wordpress-databases。我已经使用David的search&replace很长时间了,即使在序列化数据中,我也可以很好地更改例如url的内容。所以我就是这样做的:只是硬编码链接,然后将数据库移到另一个域后进行转换。彼得,祝你好运
彼得·彼得·

到目前为止,我发现成功从开发环境迁移到活动环境的唯一方法是在执行SQL转储后,对整个文件进行搜索和替换,而不仅仅是更改home和siteurl选项。我有超过1000次URL所在的文件。(仍然不知道它是如何做到这么高的:))
Rob Williams

@ Peter,@ Rob谢谢大家的回答,我担心搜索和替换是唯一的解决方案,但想先提出。我将看一下该脚本。
Willington Vega

最好是使用我建议的脚本。请注意,如果以及何时搜索和替换字符串的长度不相同,则在db转储中进行文本搜索和替换将破坏序列化的数据(特别是在wp_options中找到),因为该数据以长度说明存储在db中。成功,彼得
彼得

Answers:


9

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

这是您需要放入URL字段的内容:

/index.php/internal-site-name

在此处输入图片说明

一切正常!

最好的问候克里斯


1
这可行,但它也会更改URL以包括index.php。对于具有#个链接的单页面应用程序,它将首先刷新页面,然后将您带到目标位置(仅第一次)。即便如此,一个好主意
Catalin Deaconescu

我使用/ something没有index.php部分,并且似乎可以正常工作
user3808307

4

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

在此示例中,我们查找以开头的href属性/,并在这种情况下添加测试网站的网址:

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 );

您可以使用此代码创建一个简单的插件,然后仅在您的测试服务器上将其激活,或者创建某种标记,以便在存在测试站点环境时有条件地应用此过滤器。


那是我发现的最好方法!但请@Milo,使用此更智能的wordpress基本url(获取wordpress的site_url)更改第三行:$ atts ['href'] = site_url()。$ atts ['href'];
gtamborero

2

<base href=" ">在head meta中使用tag将为页面中所有相对锚点提供基本URL。

参考:
https : //www.w3.org/TR/html4/struct/links.html
12.4路径信息:BASE元素

WordPress中的相对自定义链接:
如果您希望站点网址成为所有锚点的基本网址,则将其添加到主题的header / php<head>

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

我知道您可能会迟到,但可以帮助其他人。


看起来很有希望。我将对其进行测试并进行报告。
Eric Hepperle-CodeSlayer2010'4

ehepperle.com/sites/in-progress/some-wp-site-root/除非您明确设置网站根目录,否则无法使用类似的路径。使用base标签不会显着提高Web开发速度,因为当您迁移到另一个站点时,您将不得不重新定义基础。但是,我可以看到该值减少了href值的长度。
Eric Hepperle-CodeSlayer2010 '19

这个想法很好,但是当在wp自定义菜单上使用相对路径时,Wordpress会忽略基本路径(例如:/ contact)
gtamborero

1

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

示例
如果要转到主页,只需将其/作为自定义URL

如果要转到文件夹中的索引页,则将bbforums/bbforums作为自定义URL。

这使您可以将站点移至测试域,而不必在菜单的所有自定义链接中对新的blogURL进行硬编码。

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


6
这不适用于带有斜杠的博客URL,例如example.com/blog。跟随菜单项“ /”,您将直接进入example.com
Jimpanzee 2014年

1

首先,您必须为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'::

现在,您可以转到前端并检查短代码是否有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.