使用WP_USER_QUERY按生日对用户进行排序

时间:2015-07-04 作者:need-help

我已经创建了保存用户生日(生日)的用户元。

生日是日期字段。

现在,我想知道如何根据特定月份对所有过生日的用户进行排序(获取)。

我已经创建了可以保存所有月份的下拉菜单。

function users_months_dropdown() {
?> 
<select name="month" id="month" onchange="" size="1">
    <option value="01">January</option>
    <option value="02">February</option>
    <option value="03">March</option>
    <option value="04">April</option>
    <option value="05">May</option>
    <option value="06">June</option>
    <option value="07">July</option>
    <option value="08">August</option>
    <option value="09">September</option>
    <option value="10">October</option>
    <option value="11">November</option>
    <option value="12">December</option>
</select>
<?php
        submit_button( __( \'Filter Date\' ), \'secondary\', \'filter_date_action\', false );
}
add_action( \'restrict_manage_users\', \'users_months_dropdown\' );
现在我用查询堆栈

我也尝试

function extended_user_searchs( $user_query ){
    if( isset( $_GET[\'month\'] ) && !empty( $_GET[\'month\'] ) ) {
        $date = $_GET[\'month\'];
        $user_query->query_where .= " AND MONTH(birthday) = $date";
    }
}
add_action( \'pre_user_query\', \'extended_user_searchs\' );

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

用户元查询RLIKE:

如果出生日期存储为dd/mm/yyyy, 在用户元中,您可以通过以下元查询找到所有八月生日用户:

\'meta_query\' => [
    [
        \'key\'     => \'birthday\',
        \'value\'   => \'/08/\',
        \'compare\' => \'RLIKE\'
    ],
]
您还可以考虑在用户元中另外存储生日月份。

Here 我列出了可用的元比较。

应用于代码段:

Part #1

下面是如何将其应用于代码示例:

/**
 * Setup the user meta query for the current birth month
 */
add_action( \'pre_get_users\', function( $user_query ) 
{
    // User input:
    $birthmonth = filter_input( INPUT_GET, \'birthmonth\', FILTER_SANITIZE_NUMBER_INT );

    // Setup the meta query:
    if( $birthmonth ) 
    {
        $user_query->query_vars[\'meta_key\']     = \'birthday\';
        $user_query->query_vars[\'meta_value\']   = zeroise( $birthmonth, 2 );
        $user_query->query_vars[\'meta_compare\'] = \'RLIKE\';
    }
} );          
我们使用pre_get_users 钩子而不是pre_user_query 并使用handyzeroise() 功能-查看\\WP_Locale 班我们将使用get_month() 下面第二部分中的方法。

请注意,在当前直接修改SQL查询的尝试中birthday 字段被视为wp_users 桌子还有INNER JOIN, 在wp_usermeta 缺少表。

您还必须验证/清理用户输入。

Part #2

第二部分修改为:

/**
 * Add a birth month filter to the users table
 */    
add_action( \'restrict_manage_users\', function()
{   
    global $wp_locale;

    // User input:
    $birthmonth = filter_input( INPUT_GET, \'birthmonth\', FILTER_SANITIZE_NUMBER_INT );

    // Birthmonth select box: 
    print \'<select name="birthmonth" id="birthmonth" onchange="" size="1">\';
    printf( \'<option value="">%s</option>\', __( \'Birthmonth\' ) );
    foreach( range(1,12) as $month )
    {
        printf( 
            \'<option value="%d" %s>%s</option>\', 
            $month, 
            selected( $birthmonth, $month ), 
            $wp_locale->get_month( $month )  
        );
    } 
    print \'</select>\';
} );
我们使用的位置birthmonth 而不是month, 以避免名称冲突。

我还添加了默认状态,没有任何birthmonth 已选定。

还添加了handyselected() 函数,以显示当前选定的选项。

月份名称在\\WP_Locale 类和类实例可通过全局$wp_locale 对象

结束

相关推荐

Users redirected to old site

如果我以管理员身份登录,一切都很好。但是,如果我以用户身份登录,它会重定向到旧的测试站点(用于运行站点的开发服务器)。我已经检查了数据库中的siteurl和home值是否正确。我也在使用付费会员pro插件。我搜索了数据库,找到了740个旧URL的条目:(有人能建议在不破坏现场的情况下,最好的前进方式吗?谢谢