Pregunta

En mi blog de WordPress tengo acontecimientos Quiero orden y filtro por campos personalizados. El orden debe ser realizado por el campo personalizado "event_date_end", que significa que cada evento que todavía se está ejecutando debe mostrar.

Para ordenar los eventos que utilizo un segundo campo "event_date_start" personalizado. Así que un evento, que se inicia el día 10 y termina el día 20 que se debe mostrar hasta el día 20, pero debe ser pedido junto al resto de los acontecimientos a partir de la 10a.

Yo uso temática como tema principal y la función así que utilizo los query_posts () añadir tanto las reglas como parámetros. Esta es la forma en que lo uso en el bucle í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');

Ahora los mensajes se ordenan correctamente, sino también el filtro se hará sobre el valor "event_date_start". Así que un evento, que se ha iniciado ayer y todavía en marcha, no se mostrará.

Si cambio a la orden del "filtro" y las partes "orden", voy a ver todos los eventos, sino un evento a partir de los días 10 y terminando en la 20ª serán colocados a todo evento el día 20.

Sé que puedo crear consultas en SQL misma, pero que trabajará con temática? Y cómo tengo que declaraciones de escritura para archivo, categoría, etiqueta lista?

La solución :

Después de leer las páginas mencionadas, he encontrado la siguiente solución. Tenía que usar un poco de SQL crudo y añadirlos a través de filtros dentro del filtro de bucle específica. Estas son las funciones I añadido:

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';
}

Y de lo que simplemente añadido filtro a estas funciones dentro de la por ejemplo bucle í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');

Ahora puede utilizar simplemente que el filtro y el orden en los bucles de índice y categoría pero mantener el "estilo de registro" filtro por defecto y las órdenes en las páginas de archivo.

¿Fue útil?

Solución

Esto no va a funcionar, porque está configurando mismo parámetro meta_key dos veces con diferentes valores y sólo uno será eficaz.

En lugar de construir consultas primas es mejor usar filtros para modificar consulta WP. de consulta general documentación tiene lista de ganchos donde se puede insertar sus modificaciones (como el final bajo ¿Qué plugins puede modificar ).

Licenciado bajo: CC-BY-SA con atribución
scroll top