1. Code
  2. WordPress

Dominar los metadatos de WordPress: Consulta de publicaciones y usuarios por metadatos

Scroll to top
5 min read

Spanish (Español) translation by Esther (you can also view the original English article)

Hasta ahora en esta serie has aprendido a acceder a los meta data (metadatos) de WordPress, y a trabajar con las matrices (arrays) en las que se devuelven. No solo añadimos campos personalizados a los posts de WordPress para poder mostrar esta información, sino también para poder clasificarla por ella.

Ahora que sabes cómo recuperar y mostrar metadatos, es hora de aprender a personalizar el bucle de WordPress para que devuelva solo las publicaciones con metadatos específicos.

Uso de WP_Query para consultar por el Meta Field Value (valor de campo meta)

Para personalizar qué publicaciones devuelve WordPress en base a los meta fields (metacampos), necesitamos usar WP_Query y especificar una meta_query. Si, por ejemplo, tuviéramos un tipo de publicación personalizado llamado "films" que tuviera un campo personalizado llamado "director" podríamos buscar películas cuyo director fuera un director de una de las tres películas de Star Wars.

Echa un vistazo al código de abajo y mira si puedes usar tu dominio de los arrays que descargaste en la última parte para entender lo que está pasando con la meta_query, que voy a desglosar lo que está pasando en el código.

1
$sw_args = array(
2
	'post_type' => 'films',
3
	'meta_query' => array(
4
		array(
5
			'key' => 'director',
6
			'value' => array( 'George Lucas', 'Richard Marquand', 'Irvin Kershner' ),
7
			'compare' => 'IN',
8
		)
9
	)
10
);
11
$query = new WP_Query( $sw_args );
12
if ( $the_query->have_posts() ) {
13
     echo '<h2>Films By Star Wards Directors</h2>';
14
     echo '<ul>';
15
		while ( $the_query->have_posts() ) {
16
			$the_query->the_post();
17
			echo '<li>' . get_the_title() . '</li>';
18
	}
19
        echo '</ul>';
20
}
21
/* Restore original Post Data */
22
wp_reset_postdata();

Como puedes ver, tenemos una serie de nombres de directores dentro de otras tres matrices. Vamos a desarmarlo, pieza por pieza.

Primero, empezamos un array para nuestros arcos de WP_Query. Después de nuestro primer argumento 'post_type', comenzamos una matriz para alojar nuestros argumentos de meta_query.

Dentro de eso especificamos qué llave buscar, en el caso "director". También proporcionamos una serie de valores para buscar en esa clave.

El último argumento es cómo comparar esos valores, en este caso especificamos "IN" para recuperar cualquier publicación con esos valores en el director clave.

Otras comparaciones

¿Y si quisiéramos películas que fueran dirigidas por un director de una película de Star Wars, pero no queremos excluir las Precuelas de Star Wars? Podemos añadir otro array de argumentos a nuestra meta_query, pero esta vez para el valor utiliza un array de esos títulos de películas para clave film_title y para comparar, utilizar 'NOT LIKE' para excluir las publicaciones que tienen estos valores en el campo film_title.

1
$sw_args = array(
2
	'post_type' => 'films',
3
	'meta_query' => array(
4
		array(
5
			'key' => 'director',
6
			'value' => array( 'George Lucas', 'Richard Marquand', 'Irvin Kershner' ),
7
			'compare' => 'IN',
8
		),
9
                array(
10
			'key' => 'film_title',
11
			'value' => 'Phantom Menace', 'Attack of the Clones', 'Revenge of the Sith' ),
12
			'compare' => 'NOT LIKE'
13
		),
14
15
	)
16
);
17
$query = new WP_Query( $sw_args );

Ahora WordPress buscará películas de estos tres directores, cuyo título no es una de las tres precuelas.

Visualizar los Meta Fields (metacampos) en WP_Query

Hasta ahora te he mostrado cómo usar WP_Query para encontrar publicaciones que tienen valores específicos para un campo personalizado, pero no cómo mostrar esos campos.

Mostrar estos campos es más o menos lo mismo que antes, pero en lugar de usar get_the_ID() para especificar el ID de get_post_meta() lo especificamos en un contexto de objeto. Así que en nuestro bucle, que puedes ver más abajo, el ID se recupera de forma un poco diferente usando $query->post->ID.

1
$sw_args = array(
2
	'post_type' => 'films',
3
	'meta_query' => array(
4
		array(
5
			'key' => 'director',
6
			'value' => array( 'George Lucas', 'Richard Marquand', 'Irvin Kershner' ),
7
			'compare' => 'IN',
8
		),
9
                array(
10
			'key' => 'film_title',
11
			'value' => 'Phantom Menace', 'Attack of the Clones', 'Revenge of the Sith' ),
12
			'compare' => 'NOT LIKE'
13
		),
14
15
	)
16
);
17
$query = new WP_Query( $sw_args );
18
if ( $the_query->have_posts() ) {
19
     echo '<h2>Films By Star Wards Directors</h2>';
20
     echo '<ul>';
21
		while ( $the_query->have_posts() ) {
22
			$the_query->the_post();
23
			echo '<li><ul>';
24
			echo '<li>' . get_the_title() . '</li>';
25
			echo '<li>' . get_post_meta( $query->post->ID, 'director', true ). '</li>';
26
			echo '</ul></li>''

27
		}

28
        echo '</ul>';
29
}
30
/* Restore original Post Data */
31
wp_reset_postdata();

Usar WP_User_Query

Al igual que en la última parte cuando usamos WP_Query para encontrar publicaciones con ciertos valores para varios campos personalizados, podemos usar WP_Query equivalente de la tabla de usuario de WP_User_Query.

Por ejemplo, si tuviéramos un campo personalizado llamado subscriber_level y quisiéramos encontrar sólo aquellos usuarios que tuvieran el nivel de suscriptor de extra_special o super_special podríamos, de la misma manera que buscamos las películas dirigidas por los tres directores de las películas de Star Wars:

1
$args = array(
2
	'meta_query' => array(
3
		array(
4
			'key'     => 'subscriber_level',
5
			'value'   => array('extra_special', 'super_special' );
6
			'compare' => '='
7
		)
8
	)
9
 );
10
$user_query = new WP_User_Query( $args );
11
12
if ( ! empty( $user_query->results ) ) {
13
	echo '<h3>Extra and Super Special Users</h3>';
14
	echo '<ul>';
15
	foreach ( $user_query->results as $user ) {
16
		echo '<li>' . $user->display_name . '</li>';
17
	}
18
	echo '</ul>';
19
}

Al igual que con WP_Query, podemos combinar diferentes comparaciones para controlar mejor qué usuarios devuelven nuestra consulta. El siguiente ejemplo combina la última consulta con una consulta, esta vez de la propia tabla wp_users para cualquier usuario cuyo nombre sea Luke, Han o Leia.

1
$args = array(
2
	'meta_query' => array(
3
		array(
4
			'key'     => 'subscriber_level',
5
			'value'   => array('extra_special', 'super_special' );
6
			'compare' => '='
7
		)
8
	),
9
	'search'         => array( 'Luke', 'Han', 'Leia' ),
10
	'search_columns' => array( 'user_nicename', 'display_name' ),
11
 );
12
$user_query = new WP_User_Query( $args );
13
if ( ! empty( $user_query->results ) ) {
14
	echo '<h3>Extra and Super Special Users Named Luke, Han or Leia</h3>';
15
	echo '<ul>';
16
	foreach ( $user_query->results as $user ) {
17
		echo '<li>' . $user->display_name . '</li>';
18
	}
19
	echo '</ul>';
20
}

Terminando

En esta serie has sido introducido a los meta data (metadatos) de WordPress y has aprendido algunas lecciones sobre los conceptos básicos del PHP a lo largo del camino.

Has aprendido a obtener los valores de los campos que almacenan los metadatos de los mensajes y usuarios y a construir consultas para los mensajes y usuarios basadas en los metadatos. Con este conocimiento puedes estar preparado para trabajar con unos pocos campos personalizados y en camino de usar WordPress como un complejo sistema de gestión de contenidos.