La documentación de WordPress indica que no debemos usar funciones como get_posts para modificar los queries que la plataforma lleva a cabo.
La alternativa recomendada es usar el filtro pre_get_posts, que como su nombre sugiere se ejecuta antes de que la consulta principal tenga efecto.
En este caso vamos a crear una clase llamada PreGetPosts para filtrar los resultados de la consulta principal y presentar solamente Links –post-format-link– y Status –post-format-status–.
Para ello debemos considerar que el filtro a establecer es de tipo taxonomía, es decir, la variable que tenemos que cambiar es tax_query.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace WordPress\Filters; | |
class PreGetPosts{ | |
public $filterPriority = 10; | |
public function __construct( $priority = 10 ){ | |
//TODO: Set your custom properties if needed | |
$this->filterPriority; | |
} | |
public function init(){ | |
add_filter( 'pre_get_posts', array( __CLASS__, 'preGetPostsFilter' ), $this->filterPriority ); | |
} | |
/*** | |
* Description: This filter modifies the tax_query var to load only quotes and status post formats | |
* @param $wpQuery: a pointer passed to the global variable $wp_query; | |
*/ | |
public static function preGetPostsFilter( $wpQuery ){ | |
if( $wpQuery->is_main_query() && is_home() ){ | |
$wpQuery->set( 'tax_query', array( | |
array( | |
'taxonomy' => 'post_format', | |
'field' => 'slug', | |
'terms' => array( 'post-format-link', 'post-format-status' ), | |
'operator' => 'IN' | |
), | |
# Add more filter for the taxonomy. Like this one, which filters out all images | |
#array( | |
# 'taxonomy' => 'post_format', | |
# 'field' => 'slug', | |
# 'terms' => array( 'post-format-image' ), | |
# 'operator' => 'NOT IN' | |
#) | |
) | |
); | |
} | |
} | |
} | |
//To make this work just write a require('PATHTOFILE') command in your functions.php | |
$wpFilters = new \WordPress\Filters\PreGetPosts( 1 ); | |
// | |
add_action( 'init', array( $wpFilters, 'init' ) ); |
Este GIST de GitHub ya genera los resultados deseados. Lo único que hay que hacer es incluirlo dentro de nuestro archivo functions.php.
Al hacer esto, el archivo PHP que contiene la clase, crea una instancia de la clase PreGetPosts, con el valor 1, el cual establece la prioridad para nuestro filtro de WordPress.
En la línea final de nuestro archivo le indicamos a WordPress que en el método INIT debe invocar la función del mismo nombre en la instancia creada 2 líneas antes.