“PRE_USER_QUERY”干扰用户导出

时间:2016-04-06 作者:dingo_d

我需要为我创建的自定义元数据向客户端wordpress添加可排序的列,所以我使用了pre_user_query

add_action(\'pre_user_query\', \'user_column_orderby\');

function user_column_orderby($user_search) {
    global $wpdb, $current_screen;

    if ( \'users\' != $current_screen->id )
        return;

    $vars = $user_search->query_vars;

    if(\'Kön\' == $vars[\'orderby\']) {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key=\'gender\')";
        $user_search->query_orderby = \' ORDER BY UPPER(m1.meta_value) \'. $vars[\'order\'];
    } elseif (\'Ålder\' == $vars[\'orderby\']) {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key=\'age\')";
        $user_search->query_orderby = \' ORDER BY UPPER(m1.meta_value) \'. $vars[\'order\'];
    } elseif (\'Distrikt\' == $vars[\'orderby\']) {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key=\'district\')";
        $user_search->query_orderby = \' ORDER BY UPPER(m1.meta_value) \'. $vars[\'order\'];
    } elseif (\'Kategori\' == $vars[\'orderby\']) {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key=\'category\')";
        $user_search->query_orderby = \' ORDER BY UPPER(m1.meta_value) \'. $vars[\'order\'];
    }
}
如果您在用户屏幕上,这很好用。但我还添加了一个导出到csv按钮,它调用export-csv.php 如下所示的文件:

<?php
$location = $_SERVER[\'DOCUMENT_ROOT\'];
include ($location . \'/wp-load.php\');

if (current_user_can(\'manage_options\')) {
    header("Content-type: application/force-download");
    header(\'Content-Disposition: inline; filename="users\'.date(\'YmdHis\').\'.csv"\');

    // WP_User_Query arguments
    $args = array (
        \'order\'          => \'ASC\',
        \'orderby\'        => \'display_name\',
        \'fields\'         => \'all\',
    );

    // The User Query
    $blogusers = get_users( \'orderby=nicename&order=ASC\' );
    // Array of WP_User objects.
    foreach ( $blogusers as $user ) {
        //echo \'<span>\' . esc_html( $user->user_email ) . \'</span>\';
        print_r($user);
    }
}
现在,我的问题是.csv 文件有一个通知:

注意:正在尝试获取中非对象的属性/wp内容/主题/神话/管理/用户\\u附加。php在线

指向直线:

if ( \'users\' != $current_screen->id )
在我的第一个代码中。这是因为我已经迷上了pre_user_query 钩子,我在我的文件中查询用户。有没有办法抑制此通知(无需wp-config.php 删除调试代码-这不是解决方案,只是掩盖了问题)?

1 个回复
最合适的回答,由SO网友:Sumit 整理而成

\'users\' != $current_screen->id 在您的文件中$current_screen 因此,您将收到警告。

在运行代码之前,可以在用户查询和检查中传递自定义var。

$blogusers = get_users( \'orderby=nicename&order=ASC&my_filter=1\' ); 
我们经过这里my_filter=1 然后我们就可以登记了pre_user_query

global $wpdb, $current_screen;

$vars = $user_search->query_vars;

if (isset($current_screen->id) && \'users\' != $current_screen->id) {
    return;
} else if (empty($vars[\'myfilter\'])) {
    return;
}
然而,在外部文件中加载WordPress并不是一件好事。您可以将整个代码包装在一个函数中,并将其挂接到某个不发送头的操作上,而不是外部文件。

示例:

创建表单而不是链接,例如。

<form action="" method="POST">
    <input type="hidden" name="myprefix_export_csv" value="1" />
    <input type="submit" value="download" />
</form>
然后检查是否设置了自定义密钥,如果设置了自定义密钥,则使用当前代码导出CSV。

add_action(\'init\', \'export_csv\'); //you can use admin_init as well
function export_csv() {
    if (!empty($_POST[\'myprefix_export_csv\'])) {

        //Send headers
        //Query users
        //print data

        exit();
    }
}
如果您认为其他用户可以调整,也可以在表单中设置nonce。

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果