Ordenar publicaciones (en todo el sitio) por fecha de metadatos

8

Mi página personalizada 'Inicio' está configurada para ordenar mis publicaciones personalizadas a través del campo de fecha personalizada con este código (actualizado para que tenga un nombre personalizado) en functions.php:

// sort order for home page
add_action('wp', 'wwgo_check_page');
function wwgo_check_page () {
if (is_page()) {
    add_filter('get_previous_post_sort', 'sort_it');
    add_filter('get_next_post_sort', 'sort_it');
    add_filter('posts_orderby', 'sort_it' );
    add_filter('posts_join', 'join_it' );
    add_filter('posts_where', 'where_it' );

    function sort_it () {
        global $wpdb;

        return " $wpdb->postmeta.meta_value ASC ";
    }

    function join_it( $join ) {
        global $wpdb;

        $join .= " LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) ";

      return $join;
    }

    function where_it( $where ) {
        global $wpdb;
        $where .= "AND $wpdb->postmeta.meta_key = 'deadline' ";

      return $where;
    }
}



}

Lo cual es elegante y simple. Ahora. Quiero que esto funcione en todo el sitio. Quiero que las publicaciones en páginas de archivo, categorías, etc. se ordenen primero por el campo de fecha personalizado.

¿Algunas ideas?

He intentado cambiar el ' if' is_archive()pero eso no tuvo ningún efecto. Yo <! is_single()>también lo intenté .

Estoy seguro de que debería ser algo simple. Pero soy nuevo en PHP y, por lo tanto, no tengo idea.

Aquí está el sitio , donde puede ver que la página de inicio está bien ordenada, pero si hace clic en 'poesía' (la única con algunas publicaciones), la ordenación no funciona.

Cualquier sugerencia será recibida con mucha alegría.

Gracias por su amabilidad.

josh
fuente
Debe prefijar todas sus funciones con, por ejemplo, josh_para evitar nombrar colisiones.
kaiser
¿Te refieres a eso como una buena práctica o para resolver esto? He intentado copiar el código de nuevo para 'is_archive' y lo hizo déjame llamar a la función de nuevo, pero no lo hice sorting trabajo ...
Josh
1
Sí, es una buena práctica. Además: no debe ajustar funciones en funciones.
kaiser
genial, genial (acabo de copiar el código de un sitio web, tbh. Soy nuevo en php y wordpress). ¿Algún avance sobre cómo hacer que esto funcione en todo el sitio? Lo tengo trabajando con más páginas personalizadas y la misma función establecida en (is_page ()) pero aún así esto no hace nada para mis páginas de archivo. No tengo idea de cómo solucionarlos ...
Josh
1
En lugar de poner funciones en funciones, intente usar una clase en su lugar.
Manny Fleurmond

Respuestas:

2

Use el filtro de solicitudquery_vars o para agregar si no se presenta en la cadena de consultaorderbyorderby

Maxim Krizhanovsky
fuente
+1 para requestsugerencia de filtro
Michal Mau
@josh también revise esta respuesta wordpress.stackexchange.com/a/21378/2110 para ver cómo realizar pruebas is_archive()y similares tan temprano en el proceso.
Michal Mau
solicitud de filtro fue de hecho, un buen grito.
josh
0

¿Por qué no usas query_posts ()?

<?php
query_posts('meta_key=key_name&orderby=key_name&sort=ASC');
if ( have_posts() ) : while ( have_posts() ) : the_post();

endwhile; else:

endif;

wp_reset_query();

También puede alterar la consulta usando pre_get_posts hook y hacer su clasificación condicional allí con is_archive (), is_page (), etc.

Brian Fegter
fuente
0

Estoy mirando tu otra pregunta también.

Si desea ordenar por el metavalor de la fecha, naturalmente deben estar en el mismo formato. Supongo que es el formato de fecha ('m-y') de PHP que especificó en su código.

Si ese es el caso, ¿puede encontrar que si cambia su meta_valuecódigo para meta_value_numobtener un mejor resultado?

No estoy seguro de que esto funcione, pero podría valer la pena intentarlo.

djb
fuente