在触发“The Plugin Generated x Characters of Underular Output of Underful Output During Activate”错误时查看输出

时间:2011-07-28 作者:tollmanz

我正在开发一个插件,在创建新表时遇到了一些困难。我得到了“插件在激活期间生成了x个字符的意外输出”错误。是否有办法查看实际错误?我认为这个过程涉及重定向,因此我没有看到实际的错误输出。我有所有的错误报告和登录,但仍然一无所获。

3 个回复
SO网友:chrisguitarguy

有趣的是,WordPress似乎内置了在激活时显示插件错误和输出的功能。如果你看看wp-admin/plugins.php 有个案子$action switch语句表示error_scrape -- 拉尔斯的回答暗示了这一点。

如下所示:

<?php
// wp-admin/plugins.php
case \'error_scrape\':
    if ( ! current_user_can(\'activate_plugins\') )
        wp_die(__(\'You do not have sufficient permissions to activate plugins for this site.\'));

    check_admin_referer(\'plugin-activation-error_\' . $plugin);

    $valid = validate_plugin($plugin);
    if ( is_wp_error($valid) )
        wp_die($valid);

    if ( ! WP_DEBUG ) {
        error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
    }

    @ini_set(\'display_errors\', true); //Ensure that Fatal errors are displayed.
    // Go back to "sandbox" scope so we get the same errors as before
    function plugin_sandbox_scrape( $plugin ) {
        include( WP_PLUGIN_DIR . \'/\' . $plugin );
    }
    plugin_sandbox_scrape( $plugin );
    do_action(\'activate_\' . $plugin);
    exit;
    break;
如您所见,它模仿了插件激活senario,但实际上并没有激活插件。它包含插件文件,调用激活挂钩,然后退出。这一切都是在没有输出缓冲的情况下完成的,因此您可以看到发生了什么。

所以,如果那已经存在了,我们只需要把它暴露出来。一点挖掘wp-admin/plugins.php 显示我们需要一个nonce来验证。所以我们可以复制它,并研究插件列表如何构建其激活链接。然后只需在非活动插件上添加一个错误清除链接。单击它,查看您的错误。

只需钩住plugin_action_links 并添加链接:

<?php
add_filter(\'plugin_action_links\', \'wpse24278_add_scrape\', 10, 2);
/**
 * Add an "Error Scrape" action to inactive plugins.
 *
 * @uses    is_plugin_active
 * @return  array
 */
function wpse24278_add_scrape($actions, $plugin)
{
    global $status, $page, $s;

    // leave active plugins alone
    if (is_plugin_active($plugin)) {
        return $actions;
    }

    // build the url, identical to the activate URL, see the
    // plugings list table for more information.
    $url = add_query_arg(array(
        \'action\'            => \'error_scrape\',
        \'plugin\'            => $plugin,
        \'plugin_status\'     => $status,
        \'paged\'             => $page,
        \'s\'                 => $s,
    ), admin_url(\'plugins.php\'));

    // add our action.
    $actions[\'error_scrape\'] = sprintf(
        \'<a href="%s" title="%s" class="edit">%s</a>\',
        wp_nonce_url($url, \'plugin-activation-error_\' . $plugin), // see `wp-admin/plugins.php` for the nonce name
        esc_attr__(\'Check for Errors\', \'wpse\'),
        esc_html__(\'Error Scrape\', \'wpse\')
    );

    return $actions;
}
这是上面的wrapped up in a plugin.

SO网友:Lars Koudal

有趣的问题,所以我看了一下Google,一个叫Jason的家伙有了一个解决方案:

br_trigger_error(\'Some error message\', E_USER_ERROR);

function br_trigger_error($message, $errno) {
  if(isset($_GET[\'action\'])
      &amp;&amp; $_GET[\'action\'] == \'error_scrape\') {
    echo \'<strong>\' . $message . \'</strong>\';
    exit;
} else {
    trigger_error($message, $errno);
}
}
发件人http://www.squarepenguin.com/wordpress/?p=6 这也有更多的细节。

SO网友:brasofilo

我刚找到一个方法,所有的道具itzcohungrycoder. 我已经添加了挂钩参数。

add_action( \'activated_plugin\', \'save_error_wpse_24278\', 10, 2 );

function save_error_wpse_24278( $plugin, $network_wide )
{
    file_put_contents( 
        WP_CONTENT_DIR. \'/error_activation.html\', 
        $plugin . ob_get_contents() 
    );
    //update_option( \'plugin_error\',  ob_get_contents() );
}

结束

相关推荐