包括基于用户IP地址模板

时间:2019-06-07 作者:Prasanth R

我需要禁止某些IP地址访问我的wordpress网站。因此,我在我的子主题函数中使用了以下代码。php

add_action(\'template_include\', \'restrict_user_access\');
function restrict_user_access() {
    $ipAddress = $_SERVER[\'REMOTE_ADDR\'];

        if($ipAddress === \'XX.XX.XXX.XXX\') {
            return "home/www/html/blog/wp-content/themes/theme-child/restrictusers.php";
        }
    }
}
我可以加载此模板(&A);显示此IP的内容,而对于其他IP地址,我得到的是空页。

我有遗漏吗?

我的wordpress版本是4.9.10。

我还需要在其他wordpress站点v5.0.2中复制相同的过程。

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

template_include 是一个筛选器-它接受一个参数,并且应该始终返回一个值(要包含的模板)。

你的函数不能做到这一点。它不接受任何参数,仅当条件为true时才返回值-因此,如果条件为true,则不返回值,因此在这种情况下不会包含任何模板。

修复方法如下:

add_action(\'template_include\', \'restrict_user_access\');
function restrict_user_access( $template ) {
    $ipAddress = $_SERVER[\'REMOTE_ADDR\'];

        if($ipAddress === \'XX.XX.XXX.XXX\') {
            return "home/www/html/blog/wp-content/themes/theme-child/restrictusers.php";
        }
    }

    return $template;
}
另一个问题是,您永远不应该在此类过滤器中使用绝对路径。有一些函数可以帮助您根据模板的文件定位模板。因此,与此相反:

return "home/www/html/blog/wp-content/themes/theme-child/restrictusers.php";
您应该这样做:

$tpl = locate_template( array( \'restrictusers.php\' ) );
if ( $tpl ) return $tpl;

相关推荐