Integración WordPress

Sincroniza el catálogo de contenido de un sitio WordPress — artículos, categorías, etiquetas y URL — sin instalar ningún plugin de membresía. Qué va detrás del muro se decide en PayWL, no en WordPress.

A diferencia de Strapi, WordPress no tiene webhooks nativos. Esta integración combina un snippet de notificación casi en tiempo real con un sondeo de respaldo cada 5 minutos, para que ningún cambio se pierda aunque el snippet falle.

Funcionalidades

FeatureDescripción
Sync de contenidoTítulo, slug, URL, categorías y etiquetas de cada post publicado
Push casi en tiempo realSnippet PHP que notifica a PayWL al publicar, editar o despublicar un post
Sondeo de respaldoCron interno cada 5 min, por si el snippet falla o no se instaló
Sincronización inicialTrae de una vez todo el catálogo histórico del sitio
Autenticación opcionalBasic Auth (WP Application Passwords) o Bearer Token, si la API REST del cliente está protegida
Decisión de paywallSe marca por artículo en PayWL (Override de Regla) — WordPress no necesita ningún campo "premium"

Paso 1: Configurar el CMS

En Super Admin → [tenant] → CMS:

CampoValor
ProveedorWordPress
API URLLa URL base del sitio, sin /wp-json (ej. https://tudominio.com)
API TokenVacío si el contenido es público (caso normal) — ver siguiente sección si no
Content Typeposts (default, salvo que uses un custom post type)

Categorías y etiquetas quedan habilitadas por defecto — WordPress siempre expone wp/v2/categories y wp/v2/tags con esos nombres fijos, a diferencia de Strapi donde el nombre de la taxonomía es configurable.

¿API REST protegida?

Por defecto se lee contenido público sin ningún token. Si el sitio restringió su API REST, completa API Token y elige el tipo de autenticación:

TipoCuándo usarloFormato del token
Basic Auth (default)WP Application Passwords — nativo desde WordPress 5.6, sin plugin adicional (Usuarios → Perfil → Contraseñas de aplicación)usuario:xxxx xxxx xxxx xxxx
Bearer TokenUn plugin de auth por token/JWT (ej. "JWT Authentication for WP-API")El token tal cual lo emite el plugin

Paso 2: Generar el Webhook Secret

En la misma pestaña CMS, sección Webhook, clic en Generar y guarda el secreto — no se puede recuperar después, solo regenerar.

Paso 3: Instalar el snippet de notificación

En WordPress, vía el plugin Code Snippets (gratuito, repositorio oficial de plugins), crea uno nuevo con:

add_action('transition_post_status', function ($new_status, $old_status, $post) {
    if ($post->post_type !== 'post') {
        return;
    }

    if ($new_status === 'publish') {
        $event = ($old_status === 'publish') ? 'post.update' : 'post.publish';
    } elseif ($old_status === 'publish') {
        $event = 'post.trash'; // Estaba público y deja de estarlo
    } else {
        return; // Nunca estuvo público — nada que sincronizar
    }

    wp_remote_post('https://ENGINE_URL/webhooks/cms/wordpress-sync', [
        'blocking' => false,
        'timeout'  => 1,
        'headers'  => [
            'Content-Type'        => 'application/json',
            'x-tenant-id'         => 'TENANT_ID',
            'x-wp-webhook-secret' => 'WEBHOOK_SECRET',
        ],
        'body' => wp_json_encode([
            'event'     => $event,
            'post_id'   => $post->ID,
            'post_type' => $post->post_type,
        ]),
    ]);
}, 10, 3);

Reemplaza ENGINE_URL, TENANT_ID (visible en Super Admin) y WEBHOOK_SECRET (del Paso 2), y activa el snippet en todo el sitio.

Este snippet solo cubre contenido nuevo o editado a partir de ahora. Para traer el catálogo histórico, sigue con el Paso 4.

Paso 4: Sincronización inicial del catálogo completo

Mismo mecanismo genérico que ya usa Strapi — no es específico de WordPress:

  1. En el dashboard del tenant, ve a Contenido → Artículos
  2. Clic en Sincronizar
  3. Se pagina todo wp/v2/posts en el fondo (100 por página, con reintento automático), con progreso en vivo

Es idempotente — puedes volver a correrla cuando quieras.

Paso 5: Marcar qué va detrás del muro

WordPress no tiene ningún campo "premium" — todo llega como contenido abierto. En Contenido → Artículos, abre el artículo y usa el selector de Override de Regla (HARD, METERED, o sin marcar para dejarlo abierto). Aplica de inmediato, sin tocar WordPress.

Flujo de Sincronización

1 Se publica/edita un post
→
2 Snippet notifica a PayWL (push)
→
3 Sondeo de respaldo cada 5 min
→
4 Catálogo actualizado (título, categorías, URL)
→
5 Reglas de acceso evalúan el artículo

¿Cómo se sincronizan las categorías?

No hay un paso aparte para "traer categorías" — viajan incluidas en cada post (sin una llamada extra a wp/v2/categories por post). Cada vez que un post se sincroniza:

  1. Sus categorías de WordPress se guardan como slugs en el artículo
  2. Si un slug es nuevo, PayWL crea automáticamente la categoría en el catálogo — con el slug como nombre, sin ninguna regla asignada (queda abierta hasta que un admin la configure)
  3. Un admin configura después, por categoría, el tipo de regla y si es prioritaria sobre las demás, desde Contenido → Categorías

La jerarquía de categorías de WordPress (padre/hija) no se preserva — se tratan como una lista plana de slugs, igual que con Strapi.

Preguntas frecuentes

¿Qué pasa si el snippet falla o se desinstala?
El sondeo de respaldo sigue sincronizando los cambios — hay más latencia (hasta 5 min), pero ningún cambio se pierde.

¿Se puede sincronizar page además de post?
Sí — ajusta el filtro del snippet y el campo Content Type en el dashboard.

¿El contenido en borrador o privado se sincroniza?
No — solo contenido publicado. Un post que pasa de publicado a borrador/papelera se elimina del catálogo de PayWL.