Hace poco un cliente me pidió que agregara publicidad AdSense en los artículos de su blog, alrededor de unas 6600 entradas, con lo cual tenía que sentarme con tranquilidad y encontrar la mejor solución.
Básicamente hay dos formas de agregar publicidad AdSense o cualquier otro tipo de contenido ajeno a WordPress dentro de nuestros artículos: mediante el uso de ShortCodes/Bloques de Gutenberg (lo que descartaba de cuajo dada la cantidad de artículos a modificar manuamente) o en forma automática como lo explicaré en este artículo.
👍🏻 ¿Por qué sugiero realizarlo de esta manera?
- Contenido limpio: No vamos a agregar absolutamente nada a nuestros artículos, seguirán estando limpios como cuando se escribieron por primera vez.
- Gestión desde un único lugar: Manejando algunas variables (que podemos configurar desde un página de opciones personalizadas) seremos capaces de activar/desactivar o modificar el funcionamiento de las publicidades de toda la Web.
- Evitar herrores umanos: Los autores de entradas no tienen por qué estar acordándose de agregar códigos, shortcodes o bloques especiales para incrustar publicidades. Ellos a lo suyo y nosotros como programadores nos encargamos del resto.
Solución que se me ocurrió
Luego de darle algunas vueltas a la cabeza se me ocurrió la siguiente idea: Insertar el código de Google AdSense automáticamente luego de un número X de ocurrencias de un string específico dentro del cuerpo del artículo utilizando el filtro the_content
.
Lo que en castellano podríamos traducir como: «Mira, agarra todo el contenido del artículo y busca la segunda vez que aparezca este código «</p>», acto seguido inserta este código HTML que te paso».
🙂 La idea me cuadraba, ahora a ver cómo podía traducirlo a PHP.
Aquí les dejo el código con los correspondientes comentarios para su entendimiento.
/**
* Esta función agrega contenido luego de un número
* dado de párrafos.
*/
function mg_inserta_publi_en_contenido( $content ) {
// Nos aseguramos que solo afecte a los artículo de un post.
// Puede borrarse o modificarse según las necesidades.
if( ! is_singular( 'post' ) ) return;
// ¿Después de qué párrafo agregamos la publicidad?
$numero_parrafo = 2; // Lo ideal es utilizar algúna página de opción para dinamizar este valor.
// Publicidad a Insertar.
// Lo ideal es dinamizar este valor.
$publicidad = '<ins class="adsbygoogle" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-123456789" data-ad-slot="123456788"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>';
// Esta función nos ayudará a encontrar la posición exacta para insertar la publicidad.
// strposX() es una función personalizada que busca recursivamente una posición específica dentro de un string.
// "\n" es el código para el nuevo "párrafo" en WordPress. Se puede modificar este valor para buscar por otro código.
$posicion = strposX( $content, "</p>", $numero_parrafo);
/*
* Una vez que tenemos todos los valores, solo se debe devolver
* el resultado de la función substr_replace con los argumentos
* previamente calculados.
*/
return substr_replace( $content, $publicidad, $posicion, 0 );
}
add_filter( 'the_content', 'mg_inserta_publi_en_contenido', 1 );
Explicación de las líneas más importantes
9. Aplicamos este condicional para que solo afecte a las páginas de artículos (caso contrario podría agregar publicidades en plantillas no deseadas).
Puedes cambiar el condicional según lo que necesites.
12. ¿Después de qué número de párrafos se agrega la publicidad?
Tal como dice el comentario, lo ideal sería que este valor podamos obtenerlo de alguna configuración en WordPress (página de opciones).
16. En este caso estoy insertando una publicidad de Google AdSense pero podría ser cualquier HTML.
24. Llamo a una función personalizada ya que la función strpos()
de PHP no permite por defecto búsquedas recursivas.
En esta línea también podríamos reemplazar la lógica a buscar, en lugar de la finalización de un párrafo (</p>
) podríamos indicar etiquetas de imágenes, luego de un blockquote
, un encabezado h2, etc etc.
31. Con todos los valores ya calculados solo se debe llamar a la función substr_replace()
de PHP para realizar el reemplazo de cadenas de textos.
Y esta es la función personalizada que nos permitirá hacer una búsqueda recursiva de un string dentro de otro string:
/**
* Find the position of the Xth occurrence of a substring in a string
* @param $haystack
* @param $needle
* @param $number integer > 0
* @return int
*/
function strposX($haystack, $needle, $number){
if( $number == '1' ){
return strpos($haystack, $needle);
}elseif( $number > '1' ){
return strpos($haystack, $needle, strposX($haystack, $needle, $number - 1) + strlen($needle));
}else{
return error_log('Error: Value for parameter $number is out of range');
}
}
El siguiente vídeo es una demo para comprobar que funciona la inserción de un código «dummy» de HTML luego del 2do párrafo ⬇️
🎉 Genial, por un lado tenemos los artículos limpios, no agregué carga de trabajo para la escritura de nuevas entradas y junto a un panel de control donde el usuario Administrador pueda hacer sus ajustes esta solución funciona a la perfección.
Ahora ya tienes a mano una herramienta para insertar cualquier tipo de contenido dentro de tus posts de WordPress.
Deja una respuesta