Consulta SQL WP Completa

Experimentei a seguinte consulta SQL sem qualquer sucesso. Alguém que tenha uma melhor compreensão da ajuda SQL?

Aqui está o que estou tentando alcançar:

  • Obter uma lista de todos os events principais (ME) onde o parent_id = 0.
  • Peça a lista ME com base na data de publicação dos primeiros events filho que são obtidos a partir de uma sub-consulta.
  • Execute essa consulta em vez da consulta WP padrão.

Não tenho certeza de como obter os mesmos resultados no object WP_Query padrão.

O Código SQL:

SELECT * FROM `wp_posts` AS ME LEFT JOIN ( SELECT * FROM `wp_posts` AS SE WHERE SE.`post_type`="event" AND SE.`post_status` IN ("publish", "future") AND SE.`post_parent` != 0 GROUP BY SE.`post_parent` ORDER BY SE.`post_date` ASC LIMIT 1 ) AS SE2 ON ME.ID = SE2.post_parent WHERE ME.post_parent = 0 AND ME.post_type="event" AND ME.post_status IN("publish", "future") ORDER BY SE2.post_date 

O código onde será usado.

 function pre_get_posts($query) { global $wpdb; if(!is_admin() && $query->is_main_query()) { //check if the post type matches this post type if(is_post_type_archive('event')) { //will this work? $query->set('query', 'SELECT * FROM `wp_posts` AS ME LEFT JOIN (SELECT * FROM `wp_posts` AS SE WHERE SE.`post_type`="event" AND SE.`post_status` IN ("publish", "future") AND SE.`post_parent` != 0 GROUP BY SE.`post_parent` ORDER BY SE.`post_date` ASC LIMIT 1) AS SE2 ON ME.ID = SE2.post_parent WHERE ME.post_parent = 0 AND ME.post_type="event" AND ME.post_status IN("publish", "future") ORDER BY SE2.post_date'); } } } 

Solutions Collecting From Web of "Consulta SQL WP Completa"

Depois de horas de pesquisa e testes, finalmente cheguei a uma solução. Este código e SQL mostram events com um ID pai de 0 e são ordenados pelas datas de events filho.

Raw SQL não pode ser usado para replace a maneira padrão WP consulta o database, mas sempre há algum tipo de solução alternativa que pode ser usada.

O código PHP:

 < ?php function pre_get_posts($query) { global $wpdb; if(!is_admin() && $query->is_main_query()) { if(is_post_type_archive('event')) { $my_query = $wpdb->prepare('SELECT * FROM %1$s AS A LEFT JOIN (SELECT * FROM (SELECT * FROM %1$s WHERE post_type="event" AND post_date > "'.date('Ym-d').'" ORDER BY post_date ASC) AS B WHERE B.post_type = "event" AND B.post_status IN ("publish", "future") AND B.post_parent != 0 GROUP BY B.post_parent ORDER BY B.post_date ASC) AS C ON A.ID=C.post_parent WHERE A.post_type = "event" AND A.post_status IN ("publish", "future") AND A.post_parent = 0 ORDER BY C.post_date ASC;', $wpdb->posts); $ids = $wpdb->get_col($my_query); $query->set('post__in', $ids); $query->set('order', 'ASC'); $query->set('orderby', 'C.post_date'); $query->set('posts_per_page', -1); $query->set('post_status', array('publish', 'future')); } } } ?> 

A consulta SQL formatada:

 SELECT * FROM wp_posts AS A LEFT JOIN ( SELECT * FROM ( SELECT * FROM wp_posts WHERE post_type="event" AND post_date > "'.date('Ym-d').'" ORDER BY post_date ASC ) AS B WHERE B.post_type = "event" AND B.post_status IN ("publish", "future") AND B.post_parent != 0 GROUP BY B.post_parent ORDER BY B.post_date ASC ) AS C ON A.id=C.post_parent WHERE A.post_type = "event" AND A.post_status IN ("publish", "future") AND A.post_parent = 0 ORDER BY C.post_date ASC; 

@kaiser – Obrigado pelas dicas. Ainda estou aprendendo a usar este site, então eu vou manter isso em mente.

Se houver soluções mais simples para realizar os mesmos resultados, compartilhe 🙂

A única coisa que tentei realizar parece não ser complexa.

Código SQL:

 SELECT * FROM wp_posts WHERE post_type = "event" AND post_status IN ("publish", "future") AND post_date > "2015-02-26" AND post_parent != 0 GROUP BY post_parent ORDER BY post_date ASC; 

Havia duas maneiras de fazer isso. Estou usando a segunda opção por motivos de desempenho.

Opção 1: a primeira opção executa duas consultas. A primeira consulta é obter o ID de events “futuro filho” e o segundo é apenas include os registros filho com as IDs fornecidas.

 add_action('pre_get_posts', 'modify_event_pre_get_posts'); function modify_event_pre_get_posts($query) { global $wpdb; if(!is_admin() && $query->is_main_query()) { if(is_post_type_archive('event')) { $my_query = $wpdb->prepare('SELECT * FROM %1$s WHERE post_type = "event" AND post_status IN ("publish", "future") AND post_date > '.date('Ym-d').' AND post_parent != 0 GROUP BY post_parent ORDER BY post_date ASC;', $wpdb->posts); $ids = $wpdb->get_col($my_query); $query->set('post__in', $ids); $query->set('order', 'ASC'); $query->set('orderby', 'post_date'); $query->set('posts_per_page', -1); $query->set('post_status', array('publish', 'future')); } } } 

Opção 2: a segunda opção apenas executa uma consulta. Ele muda a consulta padrão do database WP para buscar os resultados desejados do database. Tome nota que usei dois ganchos aqui, nomeadamente pre_get_posts, e posts_groupby.

 add_action('pre_get_posts', 'modify_event_pre_get_posts'); add_filter('posts_groupby', 'modify_event_posts_groupby'); function modify_event_posts_groupby($group_by) { global $wpdb; if(!is_admin() && is_main_query()) { if(is_post_type_archive('event')) { $group_by = "{$wpdb->posts}.post_parent"; } } return $group_by; } function modify_event_pre_get_posts($query) { global $wpdb; if(!is_admin() && $query->is_main_query()) { if(is_post_type_archive('event')) { $query->set('post_status', array('publish', 'future')); $query->set('date_query', array('after' => date('Ym-d'))); $query->set('order', 'ASC'); $query->set('orderby', 'post_date'); $query->set('post_parent__not_in', array(0)); } } }