有条件地定义WP_DEBUG /仅针对管理员/记录错误(为所有链接附加查询arg吗?)


20

我正在客户端也可以访问的服务器上开发站点,而我想做的WP_DEBUG只是向管理员显示。关于此问题,请参考Yoast的文章

if ( isset($_GET['debug']) && $_GET['debug'] == 'true')
    define('WP_DEBUG', true);

WP_DEBUG仅针对?debug=true附加到它们的网址显示,例如http://domain.com/?debug=true

我当时在想调试栏可能默认情况下在其中保存一些信息(无论是否WP_DEBUG打开),但是我发疯了,因为我不相信这种情况。

因此,我认为有用的是检查当前用户(具有该manage_options功能,然后通过add_query_arg()以下方式运行链接:

function zs_admin_debug() {
    if (!current_user_can('manage_options')) {
        add_query_arg('debug','true');
    }
}

但是我不确定的是-是否可以使用钩子来影响网站上的所有链接?这样,管理员总会看到调试,我认为这将非常有用。与往常一样感谢您的帮助!


这个(Yoast的)解决方法对于动态调试非常有用。我还启用了运行良好的日志记录。我稍微修改了代码:if ( isset( $_GET['bug'] ) ) 所以我访问link /?bug以查看调试信息:)
Jarmerson

Answers:


18

我认为没有通用的URL挂钩。钩子很多,我可能已经错过了,但我认为没有。您可以通过adambrown.info的钩子查看。URL挂钩很多,但不是通用的。

如果我建议其他解决方案:将错误记录到文件中。

/**
 * This will log all errors notices and warnings to a file called debug.log in
 * wp-content (if Apache does not have write permission, you may need to create
 * the file first and set the appropriate permissions (i.e. use 666) ) 
 */
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors',0);

该代码直接来自wp-config.php文件的食典。如果这样做的话,您将不必担心杂耍$_GET或挑选谁是管理员,谁不是管理员。

编辑:

我忘记了一种可能的解决方案。您可以使用Javascript执行此操作。简短的脚本可以将您的参数附加到页面上的所有URL,并且您可以非常轻松地仅为管理员加载脚本。

我仍然建议使用“日志”解决方案,因为每个人的错误都会被记录下来。如果您的员工像我的一样,并发送错误的“报告”,例如“ 嘿,当您使用该表格时站点已损坏 ”,您将非常感谢。:)


我想我只是在屏幕上看到它们而被宠坏了:),但是日志文件在这里确实更有意义。我将进行更多的研究,但这似乎是迄今为止我遇到的最好的解决方案。谢谢!
Zach 2012年

5
请注意,本机日志记录已硬编码为登录到Web可访问文件,这在生产中并不是一个好主意。最好通过PHP为现场站点配置私有(不在Web文件夹中)日志文件位置。
拉斯特(Rarst)2012年

9

即使我的第一个方法是使用垃圾桶,并且s_ha_dums答案是一种干净的方法,并且可能是最好的解决方法,但让我提供另一个工作方案:

以下内容设置了一个cookie,该cookie在管理员登录系统后的24小时(86400秒)内有效。在wp-config.php中WP_DEBUG根据所述cookie的存在和值有条件地定义常量。

警告:WP_DEBUG此后将设置true为在同一天在同一台计算机上使用同一浏览器登录的每个人。

functions.php中(或作为插件):

function wpse_69549_admin_debug( $user_login, $user )
{
    if ( in_array( 'administrator', $user->roles ) ) {
        setcookie( 'wp_debug', 'on', time() + 86400, '/', get_site_option( 'siteurl' ) );
    }
}
add_action( 'wp_login', 'wpse_69549_admin_debug', 10, 2 );

请参阅:“ 法典”>“操作参考”>“ wp_login”

wp-config.php中

if ( isset( $_COOKIE['wp_debug'] ) && 'on' === $_COOKIE['wp_debug'] ) {
    define( 'WP_DEBUG', true );
} else {
    define( 'WP_DEBUG', false );
}

安德鲁·纳辛Andrew Nacin)对那篇文章发表了评论,提到init为时已晚,没有任何效果。我也尝试过,但没有用。
Zach 2012年

常量不能重新定义。一个人可以修改错误报告级别而不用接触常量,但这不是完美的。在init此之前,还有很多事情正在发生。
拉斯特

我认为,被接受的答案仍然是最可行的解决方案,但是为了完整起见,这种新方法应该可以在屏幕上显示调试通知。
约翰内斯·皮尔

啊,很酷的解决方法-一定会给您带来帮助
Zach 2012年

1
@s_ha_dum:并不是每个人都记得每个答案-至少我不记得(我以前用谷歌搜索自己的答案)。我确实记得这一件事。我是第一个回答并写绝对废话的人。根本没有申请。我遵循一项不回答的政策,除非我至少有99.5%的职业资格(我认为对您也是如此)-在这里,我已经偏离目标了。生活困扰着我,于是几个小时后,在得到一个可接受的答案之后,我仍在思考这个问题,并提出了上述建议。我也认为它很漂亮-感谢您的注意。
Johannes Pille

3

它不能精确地回答您的问题,但是从个人经验来看,我发现最好通过匹配IP地址而不是URL来启用调试模式。

这需要修改链接,并解决在WP加载所需的用户功能之前如何识别管理员。


我实际上也很喜欢这个想法-因此,如果我做过如pastebin.com/m22KNakh之类的事情,在理论上可以...正确吗?运行本地主机上预期的echo $_SERVER['REMOTE_ADDR']收益::1?老实说,这听起来像是一个单独的日志文件,这种方式(因为家庭IP似乎一直在变化)可能是个好主意。
Zach 2012年

@Zach是的,::1只是的IPv6版本127.0.0.1。动态IP的使用不太方便,但是无论如何,我仅将其视为实时的临时故障排除技术。不替换适当的本地调试设置。
拉斯特(Rarst)2012年

谢谢您告诉我。绝对像这里的两个选项一样,我将使用@s_ha_dum答案(除了我赞成的评论),这也很棒。再次感谢,我真的很感谢!
Zach 2012年

1

这也是可能的技巧,但是您需要将其放入其中,wp-config.php因为WP_DEBUG已在其中定义:

if ( isset( $_GET['debugsecret'] ) && 'debugsecret' == $_GET['debugsecret'] ) {
      define( 'WP_DEBUG', true );         
}

添加?debugsecret=debugsecret到您要调试的页面URL。


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.