Anulando wp_get_archives () apply_filters ()

2

He buscado en Google por un tiempo y no estoy seguro de cómo es la mejor manera de hacer esto.

En wp-includes/general-template.php estoy mirando la función wp_get_archives() que tiene esta línea de código en:

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );

Lo que quiero hacer es tener:

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'", $r );

Sin embargo, no estoy seguro de cómo conectarme a este filtro y sobreescribirlo en functions.php

Cualquier consejo apreciado.

Gracias,

Ian

    
pregunta Ian Jamieson 05.10.2012 - 16:56

3 respuestas

4

Un filtro de WordPress es una función que toma una cadena, matriz u objeto, le hace algo, y devuelve esa cadena, matriz u objeto filtrados .

Entonces, lo que quieres hacer es convertir "WHERE post_type = 'post' AND post_status = 'publish'" en "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'" . Eso es bastante sencillo.

Desde el punto de vista de las cosas, el filtro getarchives_where acepta dos argumentos. Así que te engancharás al filtro así:

add_filter( 'getarchives_where', 'my_fancy_filter_function', 10, 2 );

Luego, debe escribir una función que tome dos parámetros, los filtre y devuelva una cadena:

function my_fancy_filter_function( $text, $r ) {
    return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'";
}

Ahora, esta función admitirá cualquier entrada, pero siempre devolverá la cadena para el filtro que especificó. Hay formas mucho más avanzadas de agregar parámetros de consulta, pero esto logrará exactamente lo que está preguntando su pregunta.

    
respondido por el EAMann 05.10.2012 - 17:29
2

En un complemento o en el tema functions.php solo escribe:

add_filter( 'getarchives_where', 'wpse_67264_filter_getarchives_where' );

/**
 * Add post type 'events' to wp_get_archives() query.
 * 
 * No parameters needed because we ignore them anyway.
 * 
 * @wp-hook getarchives_where
 * @return  string New WHERE clause
 */
function wpse_67264_filter_getarchives_where()
{
    return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'";
}

En mi opinión, eso es mejor que un WP_Query personalizado, y ni siquiera es necesario que aceptes ningún parámetro en tu devolución de llamada porque no usas el tema. :)

Para comprender cómo funcionan los filtros, lea el Codex en la API del complemento . Básicamente, el valor de retorno de la devolución de llamada reemplazará la segunda parte en apply_filters() .

    
respondido por el fuxia 05.10.2012 - 17:30
1

Lo que realmente querrás hacer es usar la clase de WordPress incorporada llamada WP_Query . De esta manera, no cambiará la funcionalidad real del núcleo de WordPress (lo que le causaría grandes dolores de cabeza cuando sea el momento de la actualización).

En su página de archivos, reemplace su bucle actual con una consulta personalizada como esta:

$args = array(); // setup the custom posts you want in here
$custom_query = new WP_Query($args); // build a custom query
while($custom_query->have_posts()) : $custom_query->the_post();
    // inside the loop, show your posts
endwhile;
wp_reset_postdata(); // reset the query

La matriz $args es simplemente su lógica personalizada de qué publicaciones deberían aparecer dentro de este bucle. Consulte la documentación de WP_Query para obtener una lista completa de las cosas que puede incluir en esta matriz.

Por ejemplo, si desea filtrar por tipo de publicación, vea esta sección del documento y lo hará Tenga en cuenta que puede crear su matriz $args así:

$args = array('post_type' => array('post', 'events'))

Espero que ayude!

[edit◆

Acabo de darme cuenta de que quizás desee obtener una simple lista desordenada de publicaciones en el archivo (y no necesariamente mostrar las publicaciones en sí mismas, ya que así es como se comporta wp_get_archives ).

Simplemente cree su propia lista desordenada envolviendo el bucle en una etiqueta <ul> y luego dentro de las etiquetas <li> de salida del bucle alrededor de el título de la publicación archivada y el enlace permanente de la publicación archivada.

    
respondido por el Jared Cobb 05.10.2012 - 17:24

Lea otras preguntas en las etiquetas