Intereting Posts
Как настроить WordPress в интрасети? сайт с самоисследованием, медленные API-вызовы REST Плагин lazyload делает эти серверные диски занятыми? Изменение размера изображения в миниатюре, малые, средние и большие варианты greyed out Действие user_register не активируется Проблемы с несколькими входами Установить ширину изображения = 'x%' (процентная ширина не ширина пикселя) при вставке через медиа-менеджер? WordPress daily cron работает чаще, чем один раз в день Исключить или включить идентификаторы категорий в WP_Query Вывод показывает страницу вместо списка сообщений блога Кнопка «Сохранить изменения» WooCommerce появляется внутри пользовательских настроек Рекомендации по размещению метабокса? Удалить конечную точку перезаписи при деактивации? Пользовательский тип сообщения на главной странице – Основы генерации Studiopress Ссылка на страницу настроек профиля пользователя?

wpdb Пользовательские метаданные с 2 условиями

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

Я пытаюсь заполнить поле выбора именами из пользовательских данных ( meta_key « pyd_pub_author »). Но я не могу просто вызвать данные напрямую, потому что также нужно убедиться, что meta_key "pyd_pub_type" = "Newsletter"

meta_value для meta_key "pyd_pub_type" должен быть "Newsletter" а имена авторов должны поступать из meta_key « pyd_pub_author ». Трудная часть состоит в том, что есть много других « pyd_pub_authors », которые связаны с другим « pyd_pub_type », мне также необходимо их отфильтровать.

Поэтому мне нужно отфильтровать meta_value « Newsletter » и все связанные с ним « pyd_pub_author ».

Я сделал следующее:

  $metakey = $prefix . 'pub_author'; $authors_query = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT meta_value, post_id FROM $wpdb->postmeta WHERE meta_key = %s HAVING post_id = ANY ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_value = 'Newsletter' ) ", $metakey ) ); 

Это возвращает имя автора для каждого из post_id (s), которые соответствуют списку, даже если они дублируются. «DISTINCT» не фильтрует имена, потому что проверяет post_id.
Итак, к чему это приводит меня, запускается array_unique (), чтобы вырезать дубликаты. Он работает, но для этого должен быть более простой и дешевый способ.

head-> стол, head-> стол, head-> стол …

Solutions Collecting From Web of "wpdb Пользовательские метаданные с 2 условиями"

Я нашел свою ошибку в вышеуказанном запросе. По-прежнему может быть лучший способ сделать это, спасибо вам, кайзер, и я обновлю, как только сделаю больше исследований. То, что я забыл сделать, это GROUP_CONCAT другое meta_value, чтобы я мог вытащить разные биты. Это все еще кажется длиннее, чем нужно, но он быстро выполняет свою работу. Вот код, просто оберните это в форме и выберите, и вы можете сбрасывать уникальные мета-значения с помощью нескольких фильтров.

  $metakey = $prefix . 'pub_author'; $authors_query = $wpdb->get_col( $wpdb->prepare( "SELECT meta_value, post_id, GROUP_CONCAT(meta_value) FROM pyd_postmeta WHERE meta_key = %s GROUP BY meta_value HAVING post_id = ANY ( SELECT post_id FROM pyd_postmeta WHERE meta_value = 'Newsletter' ) ", $metakey ) ); if ( $authors_query ) { foreach ( $authors_query as $author ) { ?> <option value="<?php echo $author ?>" <?php selected( $pydnet_show_author, $author ) ?> ><?php echo $author ?></option>'; <?php } } 

Вы можете использовать фильтр posts_clauses чтобы перехватить запрос и изменить все, что вам нужно. Это также дает вам более подробную информацию о всех частях запроса и более простой способ отладки.

 function debug_query( $pieces ) { $dump = '<pre>'; $dump .= var_export( $pieces, FALSE ); $dump .= '</pre>'; echo $dump; } add_filter( 'posts_clauses', 'debug_query' );