• Добрый день!
    На странице плагина пытаюсь получить записи стандартного формата, но при разных манипуляциях с кодом выводятся все записи, всех форматов (gallery,video,audio,text).

    Пробывал..

    $args = array(
    'posts_per_page' => 10,
    'post_type' => 'post',
    'paged' => $paged,
    'tax_query' => array(
    'taxonomy' => 'post_format',
    'field' => 'slug',
    'terms' => ['post-format-standard']
    )
    );
    $posts = new WP_Query($args);

    но не работает.
    terms' => ['']
    тоже не работает.
    А вот..

    $args = array(
    'posts_per_page' => 10,
    'post_type' => 'post',
    'post_format' => 'post-format-video',
    'paged' => $paged
    );

    работает, но мне нужно получить только стандартные посты.
    Подскажите где я ошибся, или это баг wp.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Модератор Yuri

    (@yube)

    tax_query — массив массивов, а не простой плоский массив. Посмотрите примеры в документации.

    Благодарю Юрий за Ваш ответ.

    В итоге..
    Чтобы получить только стандартные посты нужно исключить все остальные???

    'terms' => array( 
    	'post-format-aside',
    	'post-format-audio',
    	'post-format-chat',
    	'post-format-gallery',
    	'post-format-image',
    	'post-format-link',
    	'post-format-quote',
    	'post-format-status',
    	'post-format-video'
    	),
     'operator' => 'NOT IN'
    )
    Модератор Yuri

    (@yube)

    Разве я написал про исключить?
    Смотрим пример в https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters и допиливаем запрос

    $args = array(
        'posts_per_page' => 10,
        'post_type' => 'post',
        'paged' => $paged,
        'tax_query' => array(
            array(
                'taxonomy' => 'post_format',
                'field' => 'slug',
                'terms' => ['post-format-standard']
            ),
        ),
    );
    $posts = new WP_Query($args);
    

    Юрий, данная конструкция возвращает пустоту..

    'tax_query' => array(
    	array(
    		'taxonomy' => 'post_format',
    		'field' => 'slug',
    		'terms' => array( 
    		'post-format-standard'
    		)
    	)
    )

    А если стандарт поменять на видео то работает!?

    Модератор Yuri

    (@yube)

    Я про синтаксис.

    Что есть у Вас в базе и почему оно не выбирается, можно проверить припомощи плагина query monitor и инструмента phpmyadmin: находим запрос, копируем и выполняем его в pma; если результат не такой, как ожидается, смотрим, что можно изменить|удалить|добавить.

    17 SELECT wp_posts.*
    FROM wp_posts
    WHERE 1=1
    AND wp_posts.post_type = ‘mi13_glossary’
    AND ((wp_posts.post_status = ‘publish’))
    ORDER BY wp_posts.post_date DESC

    WP_Query->get_posts()

    Плагин: mi13-glossary 15 0,0000
    18 SELECT post_id, meta_key, meta_value
    FROM wp_postmeta
    WHERE post_id IN (3264,3263,3262,3261,3260,3259,3257,3256,3255,3253,3252,3251,3250,3249,3248)
    ORDER BY meta_id ASC

    update_meta_cache()

    Плагин: mi13-glossary 30 0,0000
    19 SELECT t.*, tt.*
    FROM wp_terms AS t
    INNER JOIN wp_term_taxonomy AS tt
    ON t.term_id = tt.term_id
    WHERE tt.taxonomy IN (‘post_format’)
    AND t.slug IN (‘post-format-standard’)

    WP_Term_Query->get_terms()

    Плагин: mi13-glossary 0 0,0000
    20 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
    FROM wp_posts
    WHERE 1=1
    AND ( 0 = 1 )
    AND wp_posts.post_type = ‘post’
    AND ((wp_posts.post_status = ‘publish’))
    GROUP BY wp_posts.ID
    ORDER BY wp_posts.post_date DESC
    LIMIT 0, 10

    MySQL вернула пустой результат (т.е. ноль строк). (Запрос занял 0,0100 сек.)

    Модератор Yuri

    (@yube)

    MySQL вернула пустой результат

    Последний из списка? Потому что AND ( 0 = 1 ). Надо разобраться, откуда оно берется.

    По идее запрос должен выглядеть как-то так:

    SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID
    FROM  wp_posts
    LEFT JOIN  wp_term_relationships
    ON ( wp_posts.ID =  wp_term_relationships.object_id)
    WHERE 1=1
    AND (  wp_term_relationships.term_taxonomy_id IN (..тут список, вернувшийся от предыдущего запроса...) )
    AND  wp_posts.post_type = 'post'
    AND (( wp_posts.post_status = 'publish' ))
    GROUP BY  wp_posts.ID
    ORDER BY wp_posts.post_date DESC
    LIMIT 0, 10
    

    Кстати, чему равно $paged?

    if (isset($page)) $paged = intval($page);
    else $paged = (isset($_GET['n_page']) && intval($_GET['n_page'])>1) ? intval($_GET['n_page']) : 1;

    Пагед выставил жестко в 1, тоже самое.
    Тему поменял, все плагины выключил, тоже самое.

    Даже интересно!

    Если я кину ссылку на яндекс диск, Вы сможете у себя глянуть?

    Модератор Yuri

    (@yube)

    Вы сможете у себя глянуть?

    Нет. Слишком трудоемко воссоздавать среду, а живых тестовых сайтов с форматами у меня нет ни одного.

    Модератор Yuri

    (@yube)

    Код, аналогиный

    $args = array(
        'posts_per_page' => 10,
        'post_type' => 'post',
        'paged' => $paged,
        'tax_query' => array(
            array(
                'taxonomy' => 'post_format',
                'field' => 'slug',
                'terms' => ['post-format-standard']
            ),
        ),
    );
    $posts = new WP_Query($args);
    

    но с другим типом, другой таксономией и слагом терма отлично сработал. Только что проверил.

    С другой термой и у меня работало.
    Всё равно спасибо за участие )

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Тема «WP_Query post_format» закрыта для новых ответов.