wordpress美化代码

判断WordPress登录页面的代码,我改了5次,最后WordPress支持了

WPJAM Basic「样式定制」功能其中一块是在登录页面输入头部和尾部代码,以及其他功能:

is_login 函数

要在登录界面插入代码,首先就要判断当前页面是不是 WordPress 的登录页面,于是我写了一个名为 is_login 函数:

function is_login(){ return $GLOBALS['pagenow'] == 'wp-login.php';}

就是判断全局变量 $pagenow 是不是 'wp-login.php',很多插件或者主题也会内置这个函数,基本都是这样写的,为了防止冲突,我就加了函数是否已经定义的判断:

if(!function_exists('is_login')){ function is_login(){ return $GLOBALS['pagenow'] == 'wp-login.php'; }}不能在插件中直接使用

后面我调整了一下 WPJAM Basic 的代码,然后发现「样式定制」的登录页面的设置竟然都无效,有点神奇了。

经过大半天的 Debug ,才发现这是因为全局变量 $pagenow 是在所有插件加载完之后,才被设置的,那么插件里面直接直接使用就无效了,因为还未被设置。

但是我不想再把 WPJAM Basic 的代码调整回去了,所以我就把 is_login 函数的代码改了下,直接通过 $_SERVER['PHP_SELF'] 来判断:

if(!function_exists('is_login')){ function is_login(){ if(preg_match('#(wp-login\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'])){ return true; } return false; }}

修改之后,在我的服务器好了,样式定制也有效果了。

但是还是有人说不行,真是神奇了,我想了很久,可能他用了其他也有 is_login 函数的插件,然后其他插件还是通过判断全局变量 $pagenow 来实现,并且它的插件先加载了,所以 WPJAM Basic 的 is_login 就没用了。

wpjam_is_login 函数

真是小小的功能,那么多问题,头都大了,所以最后,我觉得就只能上自己版本的登录界面判断函数,那就按照惯例加上 wpjam_ 前缀 wpjam_is_login,这样就不会冲突了:

function wpjam_is_login(){ if(preg_match('#(wp-login\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'])){ return true; } return false;}

任何 WPAM Basic 或者其他 WPJAM 出品的插件,我都改用 wpjam_is_login,这样应该没有问题了。

然后为了防止有人在主题中直接使用 is_login 函数,并且也没有使用该函数的插件,就做个简单的兼容:

if(!function_exists('is_login')){ function is_login(){ return wpjam_is_login(); }}WordPres 自己支持了

终于一个简单的登录页面判断的函数,经过5个版本的修改,终于能够符合所有条件,也能兼容各种情况,当我狂喜的时候,WordPress自己支持了 ,WordPress 6.1 新增了这个 is_login 函数:

function is_login() { return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );}

貌似 WordPress 自己这个版本考虑得更加周全,首先自定义登录界面也考虑进去了,然后它是通过直接检测 $_SERVER['SCRIPT_NAME'] 而不是通过 did_action( 'login_form_login' ) 或者全局变量 $pagenow 来实现的,这样该函数就可以在尽早的情况下就能处理。

好吧,既然如此,那以后还是统一使用 is_login 函数,我也做了优化一下 wpjam_is_login,如果 6.1 版本直接调用 is_login,如果不是则把 WordPress 6.1 版本 is_login 的实现复制过去:

function wpjam_is_login(){ if(version_compare($GLOBALS['wp_version'], '6.1', '>=')){ return is_login(); } return false !== stripos(wp_login_url(), $_SERVER['SCRIPT_NAME']);}

我发现我的文章,大家收藏多,点赞和关注少,所以大家能否在收藏的时候,也点下赞,也关注一下我。

简单的判断 WordPress 的登录页面的代码,我改了5个版本

做一个让大家都能使用的通用 WordPress 插件需要考虑的东西很多,会碰到各种情况,和各种兼容性的判断,今天给大家分享一下 WPJAM Basic 的判断 WordPress 的登录页面的代码,前前后后经过了5个版本的演化。

WPJAM Basic「样式定制」功能其中一块是在登录页面输入头部和尾部代码,以及其他功能:

is_login 函数

那么这里就涉及到一个问题,怎么判断 WordPress 的登录页面,之前我是写了一个 is_login 函数:

function is_login(){ return $GLOBALS['pagenow'] == 'wp-login.php';}

就是判断全局变量 $pagenow 是不是 'wp-login.php',很多插件或者主题也会内置这个函数,基本都是这样写的,为了防止冲突,我就写了一个是否已经定义的判断:

if(!function_exists('is_login')){ function is_login(){ return $GLOBALS['pagenow'] == 'wp-login.php'; }}不能在插件中直接使用

后面我调整了一下 WPJAM Basic 的代码,然后发现「样式定制」的登录页面的设置竟然都无效,有点神奇了。

经过大半天的 Debug ,才发现这是因为全局变量 $pagenow 是在所有插件加载完之后,才被设置的,那么插件里面直接直接使用就无效了,因为还未被设置。

但是我不想再把 WPJAM Basic 的代码调整回去了,所以我就把 is_login 函数的代码改了下,直接通过 $_SERVER['PHP_SELF'] 来判断:

if(!function_exists('is_login')){ function is_login(){ if(preg_match('#(wp-login\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'])){ return true; } return false; }}

修改之后,在我的服务器好了,样式定制也有效果了。

但是还是有人说不行,真是神奇了,我想了很久,可能他用了其他也有 is_login 函数的插件,然后其他插件还是通过判断全局变量 $pagenow 来实现,并且它的插件先加载了,所以 WPJAM Basic 的 is_login 函数就没用了。

wpjam_is_login 函数

真是小小的功能,那么多问题,头都大了,所以最后,我觉得就只能上自己版本的判断函数,就是加上 wpjam_ 前缀:wpjam_is_login,这样就不会冲突了:

function wpjam_is_login(){ if(preg_match('#(wp-login\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'])){ return true; } return false;}

任何 WPAM Basic 或者其他 WPJAM 出品的插件,我都改用 wpjam_is_login,这样应该没有问题了。

然后为了防止有人在主题中直接使用 is_login 函数,并且也没有使用该函数的插件,就做个简单的兼容:

if(!function_exists('is_login')){ function is_login(){ return wpjam_is_login(); }}

终于一个简单的登录页面判断的函数,经过5个版本的修改,终于能够符合所有条件,也能兼容各种情况。

以后在自己主题或者插件中都可以使用 wpjam_is_login 和 is_login 函数,但是建议使用使用 wpjam_is_login 函数。

WordPress 6.1 将新增 is_login_screen 函数用于判断当前是登录界面

WordPress 6.1 将新增一个函数 is_login_screen() 用于判断当前是不是登录界面,这个函数还是相对较简单,只要当前请求的页面是登录界面,就返回 true,其他情况则返回 false。

这个函数提供了快速判断登陆界面的方法,我之前在「简单的判断 WordPress 的登录页面的代码,我改了5个版本」的文章中也写过一个函数 wpjam_is_login 也实现了类似的功能。

但是 is_login_screen() 考虑得更加周全,自定义登录界面也考虑进去了,它是通过直接检测 $_SERVER['SCRIPT_NAME'] 而不是通过 did_action( 'login_form_login' ) 或者全局变量 $pagenow 来实现的,这样该函数就可以在尽早的情况下就能处理。

function is_login_screen() { return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );}

下面的例子中,就是在 init action 中实现在登陆界面显示一段欢迎信息,这个登录界面检测就考虑了自定义的登陆界面:

function add_text_to_login() { if ( is_login_screen() ) { echo( "<h1>欢迎登录!</h1>" ); }}add_action( 'init', 'add_text_to_login' );