Manual AirPress: haz webs en WordPress con información de Airtable

He hecho más pruebas anteriormente, pero este documento lo estoy haciendo en base a una prueba en EliasGomez.pro, añadiendo la tabla de Podcasts de mi base de Podcasting.

Lo primero es crear al menos una conexión. Cada conexión es específica para una base, por lo que necesitarás crear tantas como bases a las que quieras acceder. Una vez creada, ya podrás añadir nuevos Virtual Posts y Virtual Fields.

Virtual Field

Sirve para traer información adicional a la registrada en WordPress, vinculando una columna de Airtable con un campo de WordPress. De esta forma, si el post cargado coincide con un registro de Airtable, podremos mostrar dicha información extra.

Al crear un Virtual Field, te pide indicar como identificar el registro con WordPress Field (ID or post_name) , pero según el vídeo se puede usar post_title , y quizás se pueda algún otro.

Virtual Post

En este caso no necesitamos tener dichos registros creados en WordPress, y se mostrarán en base a la URL solicitada, coinciendo con una expresión regular. En base a esto, lo más rápido sería utilizar el Record ID, pero nos quedarían URLs muy feas, por lo que lo recomendable sería tener un campo que hace las veces de slug para poder encontrarlo, por lo que crearemos un campo en base a nombre (por ejemplo), con esta fórmula, que sustituye espacios y puntos por guines, convierte a minúsculas todo el texto, y codifica cualquier caracter extraño para que sea apto para una URL:

ENCODE_URL_COMPONENT(LOWER(SUBSTITUTE(SUBSTITUTE(Nombre,' ','-'),'.','-')))

Opciones al crear el Virtual Post (ignorando las obvias):

  • URL Pattern to Match: al expresión regular que queremos usar, en principio con usar la que viene es suficiente
  • Filter by formula: la fórmula que queremos usar para encontrar el post a mostrar. Si usamos un campo llamado Slug, debería ser Slug = $1, lo que recogerá el slug de la expresión regular.
  • Map to this page: página que se usará como plantilla para mostrar los registros

Mostrar información

La idea es disponer de una página de WordPress, que lista todos los registros que se quieran mostrar, que se pueden limitar con la opción Airtable Table View Name de la configuración. Desde esta página se enlaza a todos los registros, y de esta forma se indexarán en Google, ya que la página del listado está basada en la página de WordPress que hace de plantilla y Google la rastreará.

Listado de registros

Lo único que hay que configurar obligatoriamente es URL Pattern to Match, donde podemos usar ^slug_pagina/?$. Esta expresión regular encuentra la página creada, acabe o no con barra inclinada.

Si queremos podemos filtrar u ordenar los resultados, y por supuesto espcificar una Vista concreta.

Registro individual

Tan solo hay que acceder a una URL que coincida con el regex configurado en el Virtual Post correspondiente, y diseñar la página de WordPress que hará de plantilla, ya se con shortcodes o con PHP.

Todas los registros mostrados con esta plantilla, «herederán» sus propiedades, como puede ser la configuración de indexación. Pero todo el contenido, incluyendo el H1 y title, será dinámico.

Registros relacionados

Se puede añadir registros relacionados de diferentes formas:

  • A través de un filtro
  • Directamente con PHP en la plantilla
  • Shortcode

Shortcodes

[apr field=''] attempting to be used on a page where there is no collection.

Hay un shortcode con el que mostrar campos de estos registros que es [apr field=''] attempting to be used on a page where there is no collection. y tiene varios parámetros:

  • field: que es el nombre del campo. En caso de arrays, como con las imágenes, se puede usar el formato nombre|subcampo para acceder a sus propiedades
  • glue: cadena con la que separar valores múltipes
  • wrapper: código que contendrá el resultado del shortcode, con el marcador de posición %s para mostrar el valor

no data found

Sirve para iterar por un campo cuyo valor sea múltiple. El formato de uso es:

[apr_loop field="campo"]
<img src="{{URL}}" />
[/apr_loop]

Entiendo que sería equivalente a utilizar [apr field=''] attempting to be used on a page where there is no collection. con wrapper.

y no data found

El primer shortcode sirve para cargar en el campo indicado la colección de registros relacionados con todos sus campos, sustituyendo el array de Record IDs nativo. Supongamos que estamos mostrando registros de Empresas, tenemos un campo CEO que vincula un registro de la tabla Contactos y queremos sacar su información. Sería algo así:

[apr_populate field="CEO" relatedTo="Contactos"]
[apr_loop]
[apr field=&quot;Campo&quot;]
[/apr_loop]

El segundo sortcode sirve para interar el array como si fuera un foreach y así poder acceder a los campos de cada registro. Incluso se podría cargar los registros relacionados del CEO, usando de nuevo dentro del bucle, para extraer por ejemplo los Libros escritos por el CEO, por decir algo.

Actualizar registros

Hay que crear una página de WordPress y un archivo PHP que, o bien sea un Page Template para asignarlo, o bien tenga el nombre de tipo page-slug de la página.

En el vídeo explicativo, usa como ejemplo una base de restaurantes, donde tiene una tabla de Restaurantes y otra de Cocinas (tipos de cocina: burger, italiano, etc). La idea es actualizar el Restaurante con la fecha de la visita.

Para obtener los restaurantes, consulta la Cocina y obtiene los IDs de los Restaurantes relacionados.

En primer lugar se especifica la configuración a usar:

define('CONFIG_ID', 0);
define('CONFIR_NAME', "Name");

Se puede usar cualquier de las 2. Después se crea la consulta:

//Usage: AirpressQuery($tableName, CONFIG_ID or CONFIG_NAME)
$query = new AirpressQuery("Cuisines", CONFIG_ID);
$query->filterByFormula("{Name} = 'Burgers'");

Realmente no hacen falta las constantes, pero así podemos usarlas en diferentes consultas.

En lugar de usar filterByFormula, se podría usar addFilter, y así añadir varios filtros a la vez, que usarán el operador AND().

Generamos una colección de registros con las cocinas, y buscamos los restaurantes:

//Usage: AirpressCollection->populateRelatedField($columnName, $relatedTableName)
$cuisines = new AirpressCollection($query);
$cuisines->populateRelatedField("Restaurants", "Restaurants");

Ahora ya podemos acceder a los restaurantes, y actualizar los datos:

$burger_joints = $cuisines[0]["Restaurants"];

if ( ! is_airpress_empty($burger_joints) ){
	foreach($burger_joints as $restaurant){
		// There may or may not be anything we want to update!
		$fields_to_update = array();
		if ($restaurant ["Status"] != "Visited"){
			$fields_to_update["Status"] = "Visited";
			$fields_to_update["Reservation On"] = date("c", strtotime("yesterday"));

			if(!empty($fields_to_update)){
				$restaurant->update($fields_to_update);
			}
		}
	}
}

En lugar de colocar un condicional, se podría haber filtrado la colección directamente:

$params = array("filter ByFormula" => "NOT({Status},"Visited')");
$cuisines->populateRelated Field("Restaurants", "Restaurants", $params);

Código completo:

define('CONFIG_ID', 0);
define('CONFIR_NAME', "Name");

//Usage: AirpressQuery($tableName, CONFIG_ID or CONFIG_NAME)
$query = new AirpressQuery("Cuisines", CONFIG_ID);
$query->filterByFormula("{Name} = 'Burgers'");

//Usage: AirpressCollection->populateRelatedField($columnName, $relatedTableName)
$cuisines = new AirpressCollection($query);
$cuisines->populateRelatedField("Restaurants", "Restaurants");

$burger_joints = $cuisines[0]["Restaurants"];

if ( ! is_airpress_empty($burger_joints) ){
	foreach($burger_joints as $restaurant){
		// There may or may not be anything we want to update!
		$fields_to_update = array();
		if ($restaurant ["Status"] != "Visited"){
			$fields_to_update["Status"] = "Visited";
			$fields_to_update["Reservation On"] = date("c", strtotime("yesterday"));

			if(!empty($fields_to_update)){
				$restaurant->update($fields_to_update);
			}
		}
	}
}

Crear registros

Siguiendo con el código anterior, creamos un array con la información del Restaurante y lo añadimos a la colección.

$new_restaurant = array(
	"Name" => "Nombre del restaurante",
	"Cuisine" => array($cuisines[0]->record_id())
);
$new_restaurant_record = $burger_joints->createRecord($new_restaurant);

La segunda opción es hacerlo de forma independiente:

// OR if you don't want to have to use a collection:
$new_burger_joint_data = AirpressConnect::create(CONFIG_ID, "Restaurants", $new_burger_joint_array);
$new_query = new AirpressQuery("Restaurants", CONFIG_ID);
$new_collection = new AirpressCollection($new_query, false);
$new_collection->setRecords (array($new_burger_joint_data));
$new_burger_joint_record = $new_collection[0];
echo $new_burger_joint_record->record_id(); // Will output the newly created record ID
echo "<br>";
echo $new_burger_joint_record ["Name"); // Will output Fat Joe's...

En el vídeo se ve como tiene problemas de cacheado, por lo que recomienda añadir esta línea tras crear la query, antes de obtener las cocinas:

$query->setExpireAfter(0);

¿Te gusta?