it-swarm-pt.tech

Como encomendar posts por um campo personalizado e filtrá-los por outro?

No meu blog WordPress, tenho eventos que quero encomendar e filtrar por campos personalizados. A ordem deve ser feita pelo campo personalizado "event_date_end", o que significa que todos os eventos que ainda estão em execução devem ser exibidos.

Para ordenar os eventos eu uso um segundo campo personalizado "event_date_start". Portanto, um evento que começa no dia 10 e termina no dia 20 deve ser exibido até o dia 20, mas deve ser pedido próximo a todos os outros eventos, começando no dia 10.

Eu uso Thematic como um tema pai e, portanto, uso a função query_posts () adicionando as duas regras como parâmetros. É assim que eu uso no loop de índice:

function my_index_loop($content) {
    global $query_string;
    query_posts($query_string
    // filter by event_date_end
    ."&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')
    // order by event_date_start
    ."&meta_key=event_date_start&orderby=meta_value&order=ASC"); 
}
add_filter('thematic_indexloop', 'my_index_loop');

Agora os posts estão ordenados corretamente, mas o filtro também será feito no valor "event_date_start". Portanto, um evento iniciado ontem e ainda em andamento não será exibido.

Se eu mudar a ordem das partes "filtrar" e "encomendar", verei todos os eventos, mas um evento que comece no dia 10 e termine no dia 20 será colocado em todos os eventos no dia 20.

Eu sei que posso criar consultas no SQL, mas eles vão trabalhar com o Thematic? E como eu tenho que escrever declarações para arquivar, categoria, listagem de tags?

A solução :

Depois de ler as páginas mencionadas, encontrei a seguinte solução. Eu tive que usar algum SQL bruto e adicioná-los através de filtros dentro do filtro de loop específico. Estas são as funções que adicionei:

function my_loop_where($where){
    global $wpdb;
    $where .= " AND pm_where.meta_value >= '".date('Y-m-d')."'";
    return $where;
}

function my_loop_join($join){
    global $wpdb;
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_order ON (" . $wpdb->posts . ".ID = pm_order.post_id AND pm_order.meta_key = 'event_date_start')";
    $join .= " LEFT JOIN " . $wpdb->postmeta . " AS pm_where ON (" . $wpdb->posts . ".ID = pm_where.post_id AND pm_where.meta_key = 'event_date_end')";
    return $join;
}

function my_loop_order(){
    return 'pm_order.meta_value ASC';
}

E então eu simplesmente adicionei filtro a essas funções dentro de loop de índice:

function my_index_loop($content) {
    global $query_string;
    add_filter('posts_where', 'my_loop_where' );    
    add_filter('posts_join', 'my_loop_join' );
    add_filter('posts_orderby', 'my_loop_order' );
    query_posts($query_string . "&meta_key=event_date_end&meta_compare=>=&meta_value=".date('Y-m-d')/*."&meta_key=event_date_start&orderby=meta_value&order=ASC"*/);
}
add_filter('thematic_indexloop', 'my_index_loop');

Agora eu posso facilmente usar esse filtro e fazer o pedido nos loops de índice e categoria, mas manter o filtro "estilo de log" padrão e os pedidos nas páginas de arquivo.

1
2ndkauboy

Isso não vai funcionar, porque você está configurando o mesmo parâmetro meta_key duas vezes com valores diferentes e apenas um será efetivo.

Em vez de criar consultas brutas, é melhor usar filtros para modificar a consulta WP. A documentação da Visão Geral da Consulta tem uma lista de ganchos onde você pode inserir seus mods (como o final em Quais Plugins podem Modificar ).

1
Rarst