我怎么能过滤和排序我的WordPress用户表的自定义值从另一个表?

vc6uscn9  于 2023-03-17  发布在  WordPress
关注(0)|答案(1)|浏览(184)

我正在为我的WordPress示例使用“时事通讯插件”。为了查看每个用户被分配到的时事通讯列表,我在列表应该被列出的用户表中添加了一列。到目前为止,这是有效的。现在我想在上面添加一个自定义过滤器来只查询特定列表中的用户,并按字母顺序排序新列
我设法在上面添加了一个新的过滤器

add_action( 'manage_users_extra_tablenav', 'render_custom_filter_options' );
function render_custom_filter_options() {

    // Get the Newsletter instance to receive the subscribers and list names
    $newsletter = Newsletter::instance();
    $subscriber = $newsletter->get_user(get_userdata($user_id)->user_email);
    $lists = get_option("newsletter_subscription_lists");
    
    // Remove additional array entries
    $pattern = "/list_[0-9]+$/";
    foreach ($lists as $key => $entry) {
        if(!preg_match($pattern,$key) || empty($entry)) {
            unset($lists[$key]);
        }
    }
    ?>

    <form method="GET">
        <select name="group">
            <option value="">Gruppen filtern</option>
            <?php foreach ( $lists as $value => $label ): ?>
                <option value="<?php echo esc_attr( $value ); ?>" <?php if (isset($_GET["group"]) && $value == $_GET["group"]) {echo "selected";} ?>><?php echo esc_html( $label ); ?></option>
            <?php endforeach; ?>
        </select>

        <input type="submit" class="button" value="Filter">
    </form>
    
    <?php
}

当然,这本身并不能过滤任何东西,所以我需要添加一个用户查询,但据我所知,我只能从usermeta表中查询值。
订阅用户在数据库表“wp_newsletter”中,可以通过email地址或userid进行匹配,用户被分配到的列表是该表中的列,即“list_1”=〉1;“列表_2”=〉0。
如果列表没有保存在usermeta中,有没有办法编写一个wp用户查询来只返回特定列表中的用户?列可以按字母顺序排序吗?
非常感谢!

wgeznvg7

wgeznvg71#

要根据某个表中的自定义值对WordPress用户表进行过滤和排序,您需要使用自定义查询并根据一个公共值将表连接在一起。在这种情况下,您可以根据用户的电子邮件地址或用户ID将wp_users表与wp_newsletter表连接在一起。

function wp_custom_user_query( $user_query ) {
    if ( isset( $_GET['group'] ) && $_GET['group'] != '' ) {
        global $wpdb;
        $group = sanitize_text_field( $_GET['group'] );
      
        $join_clause = " INNER JOIN {$wpdb->prefix}newsletter AS n ON n.user_id = {$wpdb->prefix}users.ID";
        $where_clause = $wpdb->prepare( " AND n.list_%d = 1", $group );
        $orderby_clause = "ORDER BY n.list_{$group} ASC, {$wpdb->prefix}users.display_name ASC";
        $user_query->query_from .= $join_clause;
        $user_query->query_where .= $where_clause;
        $user_query->query_orderby = $orderby_clause;
    }
    return $user_query;
}

add_filter( 'pre_user_query', 'wp_custom_user_query' );

此筛选器根据用户的电子邮件地址或用户ID联接wp_userswp_newsletter表。然后添加查询条件以筛选指定的组,并按用户列(列表名称)升序排序结果,后跟用户的显示名称。

相关问题