Cómo filtrar publicaciones por campos personalizados

Es frecuente cuando estamos desarrollado nuestros plugin o funcionalidades para el tema que queramos filtrar contenido en función de un Custom Field, un campo personalizado. Esta tarea es realmente simple, tan solo necesitas el código que se muestra en esta entrada. Vamos con él.

Caso práctico del filtro de contenido

Imagina que estás montando una web para un concesionario. Y quieres mostrar los coches en venta según el precio de cada modelo.

Con esto ya tienes identificado el campo personalizado que va a generar ese orden: precio. Seguramente, debes tener los diferentes modelos dentro de un CPT (Custom Post Type). Si no es así te recomiendo que lo hagas, te permitirá mantener mejor el orden en la instalación de WordPress y hacer una gestión más simple de los contenidos.

Código PHP para filtrar publicaciones por campos personalizados

Para obtener los datos debes cambiar los argumentos de la Query principal:

$args = array('post_type' => 'modelos',
              'meta_key' => 'precio',
              'orderby' => 'meta_value',
              'order' => 'ASC',
              'meta_query' => array(array('key' => 'precio','compare' => '=',))
              );
$query = new WP_Query($args);

Explicación para la modificación del código a tu proyecto

  • Como primer atributo del argumento indicamos que la selección del contenido queremos que la haga dentro de los Custom Posts Type de «modelos». Aquí puedes indicar el tipo de contenido donde tengas almacenada la información, incluso puedes pasarle un array con varios tipos de contenidos.
  • En el atributo meta_key debes indicar el nombre del custom field por el que quieras filtrar
  • En las opciones de orderby y order son las diferentes opciones de ordenar los resultados de la base de datos
  • Dentro de meta_query indicas el metodo de comparación para el filtrado. Si quieres una comparación igualitaria (=), similar (LIIKE) o con rango (>, <). Recuerda que con = y LIKE podemos obtener un resultado muy similar pero LIKE tiene un mayor coste de procesamiento, y se utiliza para la comparación de cadenas no para un filtrado estrictamente hablando.