子目录中的 Wordpress 站点,注销功能失败

Posted

技术标签:

【中文标题】子目录中的 Wordpress 站点,注销功能失败【英文标题】:Wordpress site in subdirectory, logout function failing 【发布时间】:2013-03-27 06:11:52 【问题描述】:

我们的域根目录中有 Wordpress 站点。我们使用的翻译插件会在域中附加(在我们的捷克语中)/cs - 这意味着我们可以运行多个翻译,但使用与主要英语网站相同的数据库和 wp-content。

但是,添加的 /cs 会导致注销功能失败,因为它会尝试使用当前目录作为从中提取实际站点内容的基础。

实际使用的代码是<?php echo wp_logout_url( $redirect ); ?>。我们尝试了一个简单的 html href,但注销链接是动态的,需要一个唯一的 nonce 值来验证命令。

您对我们如何使用实际站点地址 (mywebsite.com) 而不是添加的“目录” (mywebsite.com/cs) 的注销按钮有任何想法。到目前为止,我无法编辑 wp_logout_url 在它之前添加 / 。有什么想法吗?

示例链接: 正确的: http://www.mywebsite.com/backend?action=logout&redirect_to=index.php&_wpnonce=d8eaf8594a

不正确,导致 404 错误: http://www.mywebsite.com/cs/backend?action=logout&redirect_to=index.php&_wpnonce=d8eaf8594a

正在使用的实际代码(相关的注销代码是#bawlogout#部分):

add_filter( 'wp_setup_nav_menu_item', 'bawllm_setup_nav_menu_item' );
function bawllm_setup_nav_menu_item( $item )

    global $pagenow;
    if( $pagenow!='nav-menus.php' && !defined('DOING_AJAX') && isset( $item->url ) && strstr( $item->url, '#baw' ) != '' )
        $item_url = substr( $item->url, 0, strpos( $item->url, '#', 1 ) ) . '#';
        $item_redirect = str_replace( $item_url, '', $item->url );
        switch( $item_url ) 
            case '#bawloginout#' :  
                                    $item_redirect = explode( '|', $item_redirect );
                                    if( count( $item_redirect ) != 2 ) 
                                        $item_redirect[1] = $item_redirect[0];
                                    for( $i = 0; $i <= 1; $i++ ):
                                        if( $item_redirect[$i] == '%actualpage%')
                                            $item_redirect[$i] = $_SERVER['REQUEST_URI'];
                                    endfor;
                                    $item->url = is_user_logged_in() ? wp_logout_url( $item_redirect[1] ) : wp_login_url( $item_redirect[0] );
                                    $item->title = bawllm_loginout_title( $item->title ) ; break;
            case '#bawlogin#' :     $item->url = wp_login_url( $item_redirect ); break;
            case '#bawlogout#' :    $item->url = wp_logout_url( $item_redirect ); break;
            case '#bawregister#' :  if( is_user_logged_in() ) $item->title = '#bawregister#'; else $item->url = site_url( '/wp-login.php?action=register', 'login' ); break;
        
        $item->url = esc_url( $item->url );
    
    return $item;

【问题讨论】:

【参考方案1】:

最后我采取了简单的方法并在 .htaccess 中使用 Redirect 301 将带有 /cs/ 的注销链接重定向到 /

【讨论】:

【参考方案2】:

我会将 URL 放入一个变量中,以便您可以对其执行正则表达式,例如:

<?php

$url       = wp_logout_url( $redirect );
$fixed_url = preg_replace("/stuff_to_find/", "stuff_to_replace", $url);

?>

【讨论】:

这是一个好主意 Moov Tony。虽然我有点不确定 preg_replace 并将其插入到我原始帖子中显示的代码中......该行看起来像这样 case '#bawlogout#' : $item-&gt;url = wp_logout_url( $item_redirect ); preg_replace("/cs/", "/"); break; 但显示以下错误(与该特定行有关):Warning: preg_replace() expects at least 3 parameters, 2 given in... - 你能帮忙看看具体的代码? 有两点需要注意:1.你需要对一个变量执行preg_replace,2.你需要传入的第三个参数是原始URL($url)。例如:$fixed_url = preg_replace("/cs/", "/", $url); 你也可能会得到一个只查找“cs”的正则表达式,因为它非常通用。如果可能的话,最好让它更具体。 它只用于这一个按钮,不幸的是,这是 URL 的唯一区别。我尝试了case '#bawlogout#' : $item-&gt;url = wp_logout_url( $item_redirect ); $fixed_url = preg_replace("/cs/", "/", $item); break; 错误Catchable fatal error: Object of class WP_Post could not be converted to string in... 如果是这种情况,您需要在 $item 上调用 strval(): case '#bawlogout#' : $item->url = wp_logout_url( $item_redirect ); $fixed_url = preg_replace("/cs/", "/", strval($item));休息;

以上是关于子目录中的 Wordpress 站点,注销功能失败的主要内容,如果未能解决你的问题,请参考以下文章

WordPress - XAMPP 中的连接 FTP 失败

重定向但需要弄清楚在多站点 wordpress 结构中忽略 .htaccess 中的目录

在IIS上启用WordPress子域名模式多站点功能

wordpress可以搭建两个网站吗,比如一个博客一个视频

如何向启用 OpenID 的站点添加注销功能?

Nginx位置正则表达式来处理/ sub /目录中多个WordPress站点的永久链接