Как выбрать все комментарии, у которых может отсутствовать мета поле?

130
13 декабря 2018, 12:00

Как создать запрос, чтобы выбрать все комментарии из бд, но у которых может как присутствовать, так и отсутствовать мета-поле attachmentId ?

Использую эту функцию:

function kama_recent_comments( $args = array() ){
    global $wpdb;
    $def = array(
        'limit'      => 10, // сколько комментов выводить.
        'ex'         => 45, // n символов. Обрезка текста комментария.
        'term'       => '', // id категорий/меток. Включить(5,12,35) или исключить(-5,-12,-35) категории. По дефолту - из всех категорий.
        'gravatar'   => '', // Размер иконки в px. Показывать иконку gravatar. '' - не показывать.
        'user'       => '', // id юзеров. Включить(5,12,35) или исключить(-5,-12,-35) комменты юзеров. По дефолту - все юзеры.
        'echo'       => 1,  // выводить на экран (1) или возвращать (0).
        'comm_type'  => '', // название типа комментария
        'meta_query' => '', // WP_Meta_Query
        'meta_key'   => '', // WP_Meta_Query
        'meta_value' => '', // WP_Meta_Query
        'url_patt'   => '', // оптимизация ссылки на коммент. Пр: '%s?comments#comment-%d' плейсхолдеры будут заменены на $post->guid и $comment->comment_ID
    );
    $args = wp_parse_args( $args, $def );
    extract( $args );
    $AND = '';
    // ЗАПИСИ
    if( $term ){
        $cats = explode(',', $term );
        $cats = array_map('intval', $cats );
        $CAT_IN = ( $cats[ key($cats) ] > 0 ); // из категорий или нет
        $cats = array_map('absint', $cats ); // уберем минусы
        $AND_term_id = 'AND term_id IN ('. implode(',', $cats) .')';
        $posts_sql = "SELECT object_id FROM $wpdb->term_relationships rel LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id) WHERE 1 $AND_term_id ";
        $AND .= ' AND comment_post_ID '. ($CAT_IN ? 'IN' : 'NOT IN') .' ('. $posts_sql .')';
    }
    // ЮЗЕРЫ
    if( $user ){
        $users = explode(',', $user );
        $users = array_map('intval', $users );
        $USER_IN = ( $users[ key($users) ] > 0 );
        $users = array_map('absint', $users );
        $AND .= ' AND user_id '. ($USER_IN ? 'IN' : 'NOT IN') .' ('. implode(',', $users) .')';
    }
    // WP_Meta_Query
    $META_JOIN = '';
    if( $meta_query || $meta_key || $meta_value ){
        $mq = new WP_Meta_Query( $args );
        $mq->parse_query_vars( $args );
        if( $mq->queries ){
            $mq_sql = $mq->get_sql('comment', $wpdb->comments, 'comment_ID' );
            $META_JOIN = $mq_sql['join'];
            $AND .= $mq_sql['where'];
        }
    }
    $sql = $wpdb->prepare("SELECT * FROM $wpdb->comments LEFT JOIN $wpdb->posts ON (ID = comment_post_ID ) $META_JOIN
    WHERE comment_approved = '1' AND comment_type = %s $AND ORDER BY comment_date_gmt DESC LIMIT %d", $comm_type, $limit );
    //die( $sql );
    $results = $wpdb->get_results( $sql );
    if( ! $results ) return 'Комментариев нет.';
    return $results;
}

но если допустим создать такой запрос:

$arr = array(
    'meta_key' => 'attachmentId'
);
$res = kama_recent_comments($arr);

то выберутся только комментарии, у которых есть данное мета-поле
а если без аргументов:

$res = kama_recent_comments();

то выберутся все комментарии, но будет отсутствовать данное мета-поле.

READ ALSO
Выборка родительских отделов mysql

Выборка родительских отделов mysql

Имеются три таблицы(отделы, рабочие ставки, рабочие):

129
Вытащить данные из блока div

Вытащить данные из блока div

Имеется блок, допустим это <div class="myclass">, с этого блока я вытаскиваю заголовки:

113
Поле Друзей Mysql

Поле Друзей Mysql

Пишу сайт на laravelЕсть таблица (модель) user и в нем поле friends т

143
Можно ли формировать счета на оплату?

Можно ли формировать счета на оплату?

Ищу способы формирования счёта 1С Бухгалтерии на стороне PHP, чтобы его потом можно было импортировать в программу или saas версиюВозможно ли вообще...

203