brooke
  • 0
Эксперт

Вернуть ID авторов, у которых есть хотя бы одна запись

  • 0

Я нашел здесь отличный фрагмент кода, который возвращает идентификаторы пользователей по ролям. Что я хотел бы сделать, так это изменить его, чтобы он возвращал только идентификаторы пользователей, у которых есть хотя бы одно сообщение. Я попробовал INNER JOIN стол $wpdb->posts и чувствую, что сделал это правильно, но не уверен. Вот что у меня есть до сих пор:

function getUsersByRole( $roles ) {
    global $wpdb;
    if ( ! is_array( $roles ) ) {
        $roles = explode( ",", $roles );
        array_walk( $roles, 'trim' );
    }
    $sql = '
        SELECT  ID, display_name
        FROM ' . $wpdb->users . ' INNER JOIN ' . $wpdb->usermeta . ' ON ' . $wpdb->users . '.ID=' . $wpdb->usermeta . '.user_id
        AND INNER JOIN '. $wpdb->posts .'  ON ' .$wpdb->users . '.ID=' . $wpdb->posts . '.post_author
        WHERE   ' . $wpdb->usermeta . '.meta_key        =       '' . $wpdb->prefix . 'capabilities' 
        AND     (
    ';
    $i = 1;
    foreach ( $roles as $role ) {
        $sql .= ' ' . $wpdb->usermeta . '.meta_value    LIKE    '%"' . $role . '"%' ';
        if ( $i < count( $roles ) ) $sql .= ' OR ';
        $i++;
    }
    $sql .= ' ) ';
    $sql .= ' ORDER BY display_name ';
    $userIDs = $wpdb->get_col( $sql );
    return $userIDs;
}

Что выводит SQL-запрос

ВЫБЕРИТЕ ID, display_name ОТ wp_users ВНУТРЕННЕЕ СОЕДИНЕНИЕ wp_usermeta НА wp_users.ID=ba_usermeta.user_id И ВНУТРЕННЕЕ СОЕДИНЕНИЕ wp_posts НА wp_users.ID=ba_posts.post_author ГДЕ wp_usermeta.meta_key = ‘wp_capabilities’ И ( wp_usermeta.meta_value LIKE ‘%»author»%’ ИЛИ wp_usermeta.meta_value LIKE ‘%»editor»%’ ) ORDER BY display_name

Я никогда не использовал INNER JOIN (или JOIN ), поэтому я мог сделать это неправильно. Я также думаю, что мне нужно сделать подсчет или что-то в этом роде, чтобы убедиться, что я получу результат.

Любая помощь будет потрясающей

РЕДАКТИРОВАТЬ: Вот полная рабочая функция PHP для тех, кто найдет это позже.

    function getUsersByRole( $roles ) {
    global $wpdb;
    if ( ! is_array( $roles ) ) {
        $roles = explode( ",", $roles );
        array_walk( $roles, 'trim' );
    }
    $sql = 'SELECT ID, display_name
        FROM '. $wpdb->users .'
        JOIN '. $wpdb->usermeta.' ON ('.$wpdb->users.'.ID = '.$wpdb->usermeta.'.user_id AND '.$wpdb->usermeta.'.meta_key = ''.$wpdb->prefix.'capabilities')
        WHERE ID IN (SELECT post_author FROM ' .$wpdb->posts.')
        AND(';
    $i = 1;
    foreach ( $roles as $role ) {
        $sql .= ' ' . $wpdb->usermeta . '.meta_value    LIKE    '%"' . $role . '"%' ';
        if ( $i < count( $roles ) ) $sql .= ' OR ';
        $i++;
    }
    $sql .= ' ) ';
    $sql .= ' ORDER BY display_name ';
    $userIDs = $wpdb->get_col( $sql );

    return $userIDs;
}
Share
  1. Это кажется нормальным, но он будет возвращать одного и того же пользователя несколько раз из-за соединения. Теперь вы также ограничиваете редактора или автора: вам действительно нужны только текущие авторы или можно вернуть кого-то, кто раньше был автором, написал несколько постов, но сейчас имеет другую роль? Затем вы можете пропустить соединение usermeta и присоединиться только к таблице сообщений.

    • 0
  2. Вместо a JOIN вы можете использовать a IN с подзапросом, чтобы предотвратить дублирование результатов из-за соединения:

    SELECT ID, display_name
    FROM wp_users
    WHERE ID IN (SELECT post_author FROM wp_posts)
    

    Это не будет смотреть на возможности. Если вы также хотите, чтобы вы могли добавить их как объединение, но переместите meta_key предложение в объединении, а также для предотвращения дублирования результатов:

    SELECT ID, display_name
    FROM wp_users
        JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id AND wp_usermeta.meta_key = 'wp_capabilities')
    WHERE ID IN (SELECT post_author FROM wp_posts)
        AND (wp_usermeta.meta_value LIKE '%"author"%'
            OR wp_usermeta.meta_value LIKE '%"editor"%' )
    

    До вас, чтобы преобразовать это обратно в PHP! Боковое примечание: зависит ли wp_ in wp_capabilities от префикса базы данных или всегда wp_, даже если имена ваших таблиц начинаются с другого префикса?

    • 0

Оставить ответ

You must login to add an answer.