<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[PHPost | Soporte, Descargas y Tutoriales de Risus Nova - Terminados]]></title>
		<link>https://phpost.es/</link>
		<description><![CDATA[PHPost | Soporte, Descargas y Tutoriales de Risus Nova - https://phpost.es]]></description>
		<pubDate>Thu, 16 Jul 2026 00:22:12 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Tienda de Puntos v1.5]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Tienda-de-Puntos-v1-5</link>
			<pubDate>Thu, 09 Jul 2026 21:12:28 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Tienda-de-Puntos-v1-5</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Tienda de Puntos v1.5</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Actualización del módulo de Tienda de Puntos para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<span style="font-size: large;" class="mycode_size">Complemento para <span style="font-weight: bold;" class="mycode_b">Risus Nova 2.0</span>: la <span style="font-weight: bold;" class="mycode_b">Tienda de Puntos</span>. Permite a los usuarios gastar sus puntos acumulados en mejoras para su perfil y sus posts.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🆕 Novedades en la v1.5</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Regalar puntos a otro usuario</span> — desde la propia tienda, indicando el nombre del destinatario, una cantidad y un mensaje opcional</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Regalar artículos de la tienda</span> — Marco de Avatar, Medalla y Rango se pueden comprar para regalárselos a otro usuario</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Rango temporal o permanente</span> — nuevo tipo de artículo configurable: el admin elige a qué rango da acceso y durante cuántos días (0 = permanente). Al caducar, el usuario vuelve automáticamente a su rango anterior</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Nueva sección "Mis últimos regalos" en la tienda, con lo enviado y recibido</span><br />
</li>
</ul>
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ ¿Vienes de la v1.0?</span></span></span><br />
<span style="font-size: large;" class="mycode_size">No hace falta reinstalar desde cero. Solo tienes que:</span><br />
 <br />
<ol type="1" class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Ejecutar el archivo <span style="font-weight: bold;" class="mycode_b">MIGRACION_si_ya_tenias_instalada_v1.0.sql</span> una vez, en phpMyAdmin</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sustituir estos 4 archivos por los de esta versión:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.tienda.php<br />
inc/php/tienda.php<br />
themes/default/templates/modules/tienda/t.tienda.tpl<br />
themes/default/templates/modules/tienda/t.tienda.admin.form.tpl</code></div></div></li>
<li><span style="font-size: large;" class="mycode_size">Borrar la caché (<span style="font-weight: bold;" class="mycode_b">/cache/</span>)</span><br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size">Los archivos <span style="font-weight: bold;" class="mycode_b">t.tienda.historial.tpl</span>, <span style="font-weight: bold;" class="mycode_b">t.tienda.admin.tpl</span> y <span style="font-weight: bold;" class="mycode_b">tienda.css</span> no han cambiado, no hace falta volver a subirlos.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛒 ¿Qué incluye?</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Cambio de nick</span> — Los usuarios pueden cambiar su nombre una vez cada 30 días.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Título personalizado</span> — Un texto exclusivo que aparece bajo el nick en comentarios y perfil.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Color de nombre</span> — Personaliza el color del nick con cualquier color hexadecimal.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Marco de avatar</span> — Añade un marco especial alrededor del avatar.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Destacar post 24h</span> — El post aparece destacado en la portada durante 24 horas.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Post fijado 48h</span> — El post queda fijado en su categoría durante 48 horas.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Subir de rango</span> — Sube al siguiente rango sin necesidad de acumular más puntos.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Medallas</span> — Obtén medallas exclusivas para el perfil.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Rango temporal o permanente</span> — accede a un rango específico configurado por el admin, con o sin fecha de caducidad.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Regalos</span> — regala puntos o artículos de la tienda a otros usuarios.</span><br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📋 Requisitos</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Risus Nova 2.0</span> instalado y funcionando</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">PHP 8.0+</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">MySQL 5.7+</span> / <span style="font-weight: bold;" class="mycode_b">MariaDB 10.4+</span></span><br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #2196f3;" class="mycode_color">🛠️ Instalación (desde cero)</span></span></span><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span></span><br />
<span style="font-size: large;" class="mycode_size">Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> del ZIP a la raíz de tu sitio y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><span style="font-size: large;" class="mycode_size">Pulsa <span style="font-weight: bold;" class="mycode_b">Instalar ahora</span>. El instalador creará automáticamente:</span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">w_tienda</span> — catálogo de artículos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">w_tienda_compras</span> — historial de compras</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">w_tienda_regalos</span> — historial de regalos de puntos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Columnas nuevas en <span style="font-weight: bold;" class="mycode_b">u_miembros</span>: user_title, user_name_color, user_avatar_frame, user_rango_original, user_rango_expira</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Columnas nuevas en <span style="font-weight: bold;" class="mycode_b">p_posts</span>: post_featured, post_sticky_until</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">9 artículos de ejemplo con precios predefinidos</span><br />
</li>
</ul>
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ del servidor cuando termine.</span></span></span><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.tienda.php&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/tienda.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
themes/default/css/tienda.css&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/css/<br />
themes/default/t.tienda.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
themes/default/t.tienda.historial.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
themes/default/t.tienda.admin.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
themes/default/t.tienda.admin.form.tpl →&nbsp;&nbsp;themes/default/templates/</code></div></div><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Añadir el CSS en el header</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Abre <span style="font-weight: bold;" class="mycode_b">themes/default/templates/sections/main_header.tpl</span> y añade esta línea junto al resto de CSS:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;link href="{&#36;tsConfig.css}/tienda.css" rel="stylesheet" type="text/css"&gt;</code></div></div><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Añadir el enlace en el menú</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Abre <span style="font-weight: bold;" class="mycode_b">themes/default/templates/sections/head_menu.tpl</span> y añade este elemento en el menú principal:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'tienda'}here{/if}" id="tabbedtienda"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Ir a la Tienda" onclick="menu('tienda', this.href); return false;" href="{&#36;tsConfig.url}/tienda/"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;i class="fa-solid fa-store"&gt;&lt;/i&gt; Tienda<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/a&gt;<br />
&lt;/li&gt;</code></div></div><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Borrar la caché</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> desde el panel de administración o desde el gestor de archivos del hosting.</span><br />
<hr class="mycode_hr" />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #2196f3;" class="mycode_color">⚙️ Gestionar los artículos</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Accede como administrador a <span style="font-weight: bold;" class="mycode_b">tudominio.com/tienda/?action=admin</span> para:</span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Crear nuevos artículos, incluyendo rangos temporales/permanentes</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Editar precios y descripciones</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Activar o desactivar artículos</span><br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Si quieres eliminar el complemento, ejecuta esto en <span style="font-weight: bold;" class="mycode_b">phpMyAdmin</span>:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS w_tienda;<br />
DROP TABLE IF EXISTS w_tienda_compras;<br />
DROP TABLE IF EXISTS w_tienda_regalos;<br />
ALTER TABLE u_miembros DROP COLUMN user_title;<br />
ALTER TABLE u_miembros DROP COLUMN user_name_color;<br />
ALTER TABLE u_miembros DROP COLUMN user_avatar_frame;<br />
ALTER TABLE u_miembros DROP COLUMN user_rango_original;<br />
ALTER TABLE u_miembros DROP COLUMN user_rango_expira;<br />
ALTER TABLE p_posts DROP COLUMN post_featured;<br />
ALTER TABLE p_posts DROP COLUMN post_sticky_until;</code></div></div><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Y elimina los archivos subidos en el paso 2.</span></span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/LWdwRY3.png" loading="lazy"  alt="[Imagen: LWdwRY3.png]" class="mycode_img img-responsive" /><br />
<img src="https://i.imgur.com/4h6JOfl.png" loading="lazy"  alt="[Imagen: 4h6JOfl.png]" class="mycode_img img-responsive" /><br />
<img src="https://i.imgur.com/ynt9TT6.png" loading="lazy"  alt="[Imagen: ynt9TT6.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span></span></span></div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Tienda de Puntos v1.5</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Actualización del módulo de Tienda de Puntos para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<span style="font-size: large;" class="mycode_size">Complemento para <span style="font-weight: bold;" class="mycode_b">Risus Nova 2.0</span>: la <span style="font-weight: bold;" class="mycode_b">Tienda de Puntos</span>. Permite a los usuarios gastar sus puntos acumulados en mejoras para su perfil y sus posts.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🆕 Novedades en la v1.5</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Regalar puntos a otro usuario</span> — desde la propia tienda, indicando el nombre del destinatario, una cantidad y un mensaje opcional</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Regalar artículos de la tienda</span> — Marco de Avatar, Medalla y Rango se pueden comprar para regalárselos a otro usuario</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Rango temporal o permanente</span> — nuevo tipo de artículo configurable: el admin elige a qué rango da acceso y durante cuántos días (0 = permanente). Al caducar, el usuario vuelve automáticamente a su rango anterior</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Nueva sección "Mis últimos regalos" en la tienda, con lo enviado y recibido</span><br />
</li>
</ul>
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ ¿Vienes de la v1.0?</span></span></span><br />
<span style="font-size: large;" class="mycode_size">No hace falta reinstalar desde cero. Solo tienes que:</span><br />
 <br />
<ol type="1" class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Ejecutar el archivo <span style="font-weight: bold;" class="mycode_b">MIGRACION_si_ya_tenias_instalada_v1.0.sql</span> una vez, en phpMyAdmin</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sustituir estos 4 archivos por los de esta versión:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.tienda.php<br />
inc/php/tienda.php<br />
themes/default/templates/modules/tienda/t.tienda.tpl<br />
themes/default/templates/modules/tienda/t.tienda.admin.form.tpl</code></div></div></li>
<li><span style="font-size: large;" class="mycode_size">Borrar la caché (<span style="font-weight: bold;" class="mycode_b">/cache/</span>)</span><br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size">Los archivos <span style="font-weight: bold;" class="mycode_b">t.tienda.historial.tpl</span>, <span style="font-weight: bold;" class="mycode_b">t.tienda.admin.tpl</span> y <span style="font-weight: bold;" class="mycode_b">tienda.css</span> no han cambiado, no hace falta volver a subirlos.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛒 ¿Qué incluye?</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Cambio de nick</span> — Los usuarios pueden cambiar su nombre una vez cada 30 días.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Título personalizado</span> — Un texto exclusivo que aparece bajo el nick en comentarios y perfil.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Color de nombre</span> — Personaliza el color del nick con cualquier color hexadecimal.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Marco de avatar</span> — Añade un marco especial alrededor del avatar.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Destacar post 24h</span> — El post aparece destacado en la portada durante 24 horas.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Post fijado 48h</span> — El post queda fijado en su categoría durante 48 horas.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Subir de rango</span> — Sube al siguiente rango sin necesidad de acumular más puntos.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Medallas</span> — Obtén medallas exclusivas para el perfil.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Rango temporal o permanente</span> — accede a un rango específico configurado por el admin, con o sin fecha de caducidad.</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Regalos</span> — regala puntos o artículos de la tienda a otros usuarios.</span><br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📋 Requisitos</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Risus Nova 2.0</span> instalado y funcionando</span><br />
</li>
<li><span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">PHP 8.0+</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">MySQL 5.7+</span> / <span style="font-weight: bold;" class="mycode_b">MariaDB 10.4+</span></span><br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #2196f3;" class="mycode_color">🛠️ Instalación (desde cero)</span></span></span><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span></span><br />
<span style="font-size: large;" class="mycode_size">Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> del ZIP a la raíz de tu sitio y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><span style="font-size: large;" class="mycode_size">Pulsa <span style="font-weight: bold;" class="mycode_b">Instalar ahora</span>. El instalador creará automáticamente:</span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">w_tienda</span> — catálogo de artículos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">w_tienda_compras</span> — historial de compras</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">w_tienda_regalos</span> — historial de regalos de puntos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Columnas nuevas en <span style="font-weight: bold;" class="mycode_b">u_miembros</span>: user_title, user_name_color, user_avatar_frame, user_rango_original, user_rango_expira</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Columnas nuevas en <span style="font-weight: bold;" class="mycode_b">p_posts</span>: post_featured, post_sticky_until</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">9 artículos de ejemplo con precios predefinidos</span><br />
</li>
</ul>
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ del servidor cuando termine.</span></span></span><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.tienda.php&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/tienda.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
themes/default/css/tienda.css&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/css/<br />
themes/default/t.tienda.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
themes/default/t.tienda.historial.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
themes/default/t.tienda.admin.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
themes/default/t.tienda.admin.form.tpl →&nbsp;&nbsp;themes/default/templates/</code></div></div><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Añadir el CSS en el header</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Abre <span style="font-weight: bold;" class="mycode_b">themes/default/templates/sections/main_header.tpl</span> y añade esta línea junto al resto de CSS:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;link href="{&#36;tsConfig.css}/tienda.css" rel="stylesheet" type="text/css"&gt;</code></div></div><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Añadir el enlace en el menú</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Abre <span style="font-weight: bold;" class="mycode_b">themes/default/templates/sections/head_menu.tpl</span> y añade este elemento en el menú principal:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'tienda'}here{/if}" id="tabbedtienda"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Ir a la Tienda" onclick="menu('tienda', this.href); return false;" href="{&#36;tsConfig.url}/tienda/"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;i class="fa-solid fa-store"&gt;&lt;/i&gt; Tienda<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/a&gt;<br />
&lt;/li&gt;</code></div></div><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Borrar la caché</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> desde el panel de administración o desde el gestor de archivos del hosting.</span><br />
<hr class="mycode_hr" />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #2196f3;" class="mycode_color">⚙️ Gestionar los artículos</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Accede como administrador a <span style="font-weight: bold;" class="mycode_b">tudominio.com/tienda/?action=admin</span> para:</span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Crear nuevos artículos, incluyendo rangos temporales/permanentes</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Editar precios y descripciones</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Activar o desactivar artículos</span><br />
</li>
</ul>
<hr class="mycode_hr" />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Si quieres eliminar el complemento, ejecuta esto en <span style="font-weight: bold;" class="mycode_b">phpMyAdmin</span>:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS w_tienda;<br />
DROP TABLE IF EXISTS w_tienda_compras;<br />
DROP TABLE IF EXISTS w_tienda_regalos;<br />
ALTER TABLE u_miembros DROP COLUMN user_title;<br />
ALTER TABLE u_miembros DROP COLUMN user_name_color;<br />
ALTER TABLE u_miembros DROP COLUMN user_avatar_frame;<br />
ALTER TABLE u_miembros DROP COLUMN user_rango_original;<br />
ALTER TABLE u_miembros DROP COLUMN user_rango_expira;<br />
ALTER TABLE p_posts DROP COLUMN post_featured;<br />
ALTER TABLE p_posts DROP COLUMN post_sticky_until;</code></div></div><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Y elimina los archivos subidos en el paso 2.</span></span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/LWdwRY3.png" loading="lazy"  alt="[Imagen: LWdwRY3.png]" class="mycode_img img-responsive" /><br />
<img src="https://i.imgur.com/4h6JOfl.png" loading="lazy"  alt="[Imagen: 4h6JOfl.png]" class="mycode_img img-responsive" /><br />
<img src="https://i.imgur.com/ynt9TT6.png" loading="lazy"  alt="[Imagen: ynt9TT6.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span></span></span></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Vídeos v1.5]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-V%C3%ADdeos-v1-5</link>
			<pubDate>Thu, 09 Jul 2026 13:18:03 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-V%C3%ADdeos-v1-5</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Vídeos v1.5</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Actualización del módulo de Vídeos para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/gJTMPf4.png" loading="lazy"  alt="[Imagen: gJTMPf4.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ZclVYr0.png" loading="lazy"  alt="[Imagen: ZclVYr0.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/90QpwV8.gif" loading="lazy"  alt="[Imagen: 90QpwV8.gif]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/4R2mASs.png" loading="lazy"  alt="[Imagen: 4R2mASs.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ooClT4Q.png" loading="lazy"  alt="[Imagen: ooClT4Q.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/nDTNOSA.png" loading="lazy"  alt="[Imagen: nDTNOSA.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/saRfQjS.png" loading="lazy"  alt="[Imagen: saRfQjS.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/mK8CawO.png" loading="lazy"  alt="[Imagen: mK8CawO.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sistema completo de vídeos hecho desde cero para Risus Nova 2.0. Soporta YouTube y Vimeo, con comentarios, reportes, panel admin y control de permisos por rango.</span><br />
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🆕 Novedades en la v1.5</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Miniaturas reales de Vimeo</span> — hasta ahora los vídeos de Vimeo solo mostraban un icono genérico en vez de portada. Ahora el módulo consulta la API oficial de cada plataforma (YouTube y Vimeo) al publicar el vídeo y guarda la miniatura real, en vez de intentar adivinarla</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Arreglado el mismo problema en la sección "Más vídeos de este usuario" dentro de la vista de un vídeo, que también ignoraba las miniaturas de Vimeo</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Nueva columna <span style="font-weight: bold;" class="mycode_b">vid_thumb</span> en la base de datos para guardar la miniatura de forma persistente</span><br />
</li>
</ul>
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ ¿Vienes de la v1.0?</span></span></span><br />
<span style="font-size: large;" class="mycode_size">No hace falta reinstalar desde cero. Solo tienes que:</span><br />
 <br />
<ol type="1" class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Ejecutar esta consulta SQL una vez, en phpMyAdmin:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>ALTER TABLE `v_videos` ADD `vid_thumb` VARCHAR(255) NOT NULL DEFAULT '' AFTER `vid_embed`;</code></div></div></li>
<li><span style="font-size: large;" class="mycode_size">Sustituir estos 3 archivos por los de esta versión:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.videos.php<br />
themes/default/templates/modules/m.video_card.tpl<br />
themes/default/templates/modules/m.video_ver.tpl</code></div></div></li>
<li><span style="font-size: large;" class="mycode_size">Borrar la caché (<span style="font-weight: bold;" class="mycode_b">/cache/</span>)</span><br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size">Los vídeos que ya tenías publicados se quedarán sin miniatura real hasta que los vuelvas a guardar, o si prefieres, puedes rellenarlas a mano con una consulta UPDATE usando el mismo patrón de YouTube (`img.youtube.com/vi/{id}/hqdefault.jpg`) para los tuyos.</span><br />
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🎬 Características</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Soporte para <span style="font-weight: bold;" class="mycode_b">YouTube</span> y <span style="font-weight: bold;" class="mycode_b">Vimeo</span> — pegar la URL y se genera el reproductor automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Grid de tarjetas con la miniatura real del vídeo, sin bandas negras</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Filtro por categoría y orden (nuevos / más vistos)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Comentarios en cada vídeo</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sistema de reportes — 3 reportes ocultan el vídeo automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin con gestión de vídeos y categorías</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Control de permisos por rango desde <span style="font-weight: bold;" class="mycode_b">Admin → Rangos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">7 categorías por defecto (configurables desde el admin)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Instalador automático — crea todas las tablas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Diseño responsive</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">El instalador crea automáticamente:</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_videos</span> (ya incluye la columna vid_thumb)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_categorias</span> con 7 categorías por defecto</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_comentarios</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_denuncias</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Permiso <span style="font-weight: bold;" class="mycode_b">govid</span> añadido a todos los rangos</span><br />
</li>
</ul>
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
inc/php/ajax/ajax.videos.php&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/ajax/<br />
t.videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/<br />
m.video_card.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_ver.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_nuevo.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.admin_videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
videos.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/css/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En .htaccess</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba de <span style="font-weight: bold;" class="mycode_b"># FOTOS</span> agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># VIDEOS<br />
RewriteRule ^videos/&#36; inc/php/videos.php?action= [QSA,L]<br />
RewriteRule ^videos/ver/([0-9]+)/&#36; inc/php/videos.php?action=ver&amp;vid=&#36;1 [QSA,L]<br />
RewriteRule ^videos/nuevo/&#36; inc/php/videos.php?action=nuevo [QSA,L]<br />
RewriteRule ^videos/usuario/([^/]+)/&#36; inc/php/videos.php?action=usuario&amp;nick=&#36;1 [QSA,L]<br />
RewriteRule ^admin/videos&#36; inc/php/admin.php?action=videos [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
Agregar arriba:<br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'videos'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.videos.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV = new tsVideos();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['addcat']) &amp;&amp; !empty(&#36;_POST['vcat_name'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV-&gt;adminSaveCategoria();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsCore-&gt;redirectTo(&#36;tsCore-&gt;settings['url'].'/admin/videos');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;filtro = (int)(&#36;_GET['status'] ?? -1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminVideos', &#36;tsV-&gt;adminGetVideos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVCategorias', &#36;tsV-&gt;getCategorias());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVFiltro', &#36;filtro);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="font-weight: bold;" class="mycode_b">{/if}</span> final añade:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'videos'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='modules/m.admin_videos.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_rangos.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dt&gt;&lt;label for="goaf"&gt;Anti-flood&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Tiempo que deben esperar entre acci&amp;oacute;n.&lt;/span&gt;&lt;/dt&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;input type="text" id="goaf" name="global-antiflood" value="{&#36;tsRango.permisos.goaf}" style="width:30%"/&gt;&lt;/dd&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&lt;dt&gt;&lt;label for="govid"&gt;Publicar Vídeos&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Podrán publicar vídeos en el sitio.&lt;/span&gt;&lt;/dt&gt;<br />
&lt;dd&gt;&lt;input type="checkbox" id="govid" name="global-publicarvideos" {if &#36;tsRango.permisos.govid == 'on'}checked{/if} /&gt;&lt;/dd&gt;<br />
&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — En c.admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<br />
<span style="font-size: large;" class="mycode_size">En <span style="font-weight: bold;" class="mycode_b">saveRango()</span> y <span style="font-weight: bold;" class="mycode_b">newRango()</span> busca la línea:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday']);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Reemplazar por:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'govid' =&gt; &#36;_POST['global-publicarvideos'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 8 — En head_menu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;tsConfig.c_fotos_private == '1' &amp;&amp; !&#36;tsUser-&gt;is_member}{else}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="tabbed {if &#36;tsPage == 'fotos'}here{/if}" id="tabbedfotos"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Ir a Fotos" onclick="menu('fotos', this.href); return false;" href="{&#36;tsConfig.url}/fotos/"&gt;Fotos &lt;i class="fa-solid fa-caret-down"&gt;&lt;/i&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{/if}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'videos'}here{/if}" id="tabbedvideos"&gt;&lt;a title="Ir a Vídeos" href="{&#36;tsConfig.url}/videos/"&gt;Vídeos &lt;i class="fa-solid fa-film"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — Activar el permiso en los rangos</span><br />
<br />
En <span style="font-weight: bold;" class="mycode_b">Admin → Rangos → Editar</span> cada rango y activa <span style="font-weight: bold;" class="mycode_b">Publicar Vídeos</span>.</span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 10 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">📋 URLs del módulo</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Portada de vídeos: <span style="font-weight: bold;" class="mycode_b">/videos/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ver vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/ver/ID/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Publicar vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/nuevo/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Vídeos de usuario: <span style="font-weight: bold;" class="mycode_b">/videos/usuario/NICK/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin: <span style="font-weight: bold;" class="mycode_b">/admin/videos</span></span><br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS v_videos, v_categorias, v_comentarios, v_denuncias;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios realizados.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenidoídeos+v1.0.rar/file" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par...0.rar/file</a><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<span style="font-size: large;" class="mycode_size">Hilo original de la v1.0: <a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a></span><br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Vídeos v1.5</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Actualización del módulo de Vídeos para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/gJTMPf4.png" loading="lazy"  alt="[Imagen: gJTMPf4.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ZclVYr0.png" loading="lazy"  alt="[Imagen: ZclVYr0.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/90QpwV8.gif" loading="lazy"  alt="[Imagen: 90QpwV8.gif]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/4R2mASs.png" loading="lazy"  alt="[Imagen: 4R2mASs.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ooClT4Q.png" loading="lazy"  alt="[Imagen: ooClT4Q.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/nDTNOSA.png" loading="lazy"  alt="[Imagen: nDTNOSA.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/saRfQjS.png" loading="lazy"  alt="[Imagen: saRfQjS.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/mK8CawO.png" loading="lazy"  alt="[Imagen: mK8CawO.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sistema completo de vídeos hecho desde cero para Risus Nova 2.0. Soporta YouTube y Vimeo, con comentarios, reportes, panel admin y control de permisos por rango.</span><br />
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🆕 Novedades en la v1.5</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Miniaturas reales de Vimeo</span> — hasta ahora los vídeos de Vimeo solo mostraban un icono genérico en vez de portada. Ahora el módulo consulta la API oficial de cada plataforma (YouTube y Vimeo) al publicar el vídeo y guarda la miniatura real, en vez de intentar adivinarla</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Arreglado el mismo problema en la sección "Más vídeos de este usuario" dentro de la vista de un vídeo, que también ignoraba las miniaturas de Vimeo</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Nueva columna <span style="font-weight: bold;" class="mycode_b">vid_thumb</span> en la base de datos para guardar la miniatura de forma persistente</span><br />
</li>
</ul>
<br />
<span style="color: #e74c3c;" class="mycode_color"><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ ¿Vienes de la v1.0?</span></span></span><br />
<span style="font-size: large;" class="mycode_size">No hace falta reinstalar desde cero. Solo tienes que:</span><br />
 <br />
<ol type="1" class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Ejecutar esta consulta SQL una vez, en phpMyAdmin:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>ALTER TABLE `v_videos` ADD `vid_thumb` VARCHAR(255) NOT NULL DEFAULT '' AFTER `vid_embed`;</code></div></div></li>
<li><span style="font-size: large;" class="mycode_size">Sustituir estos 3 archivos por los de esta versión:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.videos.php<br />
themes/default/templates/modules/m.video_card.tpl<br />
themes/default/templates/modules/m.video_ver.tpl</code></div></div></li>
<li><span style="font-size: large;" class="mycode_size">Borrar la caché (<span style="font-weight: bold;" class="mycode_b">/cache/</span>)</span><br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size">Los vídeos que ya tenías publicados se quedarán sin miniatura real hasta que los vuelvas a guardar, o si prefieres, puedes rellenarlas a mano con una consulta UPDATE usando el mismo patrón de YouTube (`img.youtube.com/vi/{id}/hqdefault.jpg`) para los tuyos.</span><br />
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🎬 Características</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Soporte para <span style="font-weight: bold;" class="mycode_b">YouTube</span> y <span style="font-weight: bold;" class="mycode_b">Vimeo</span> — pegar la URL y se genera el reproductor automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Grid de tarjetas con la miniatura real del vídeo, sin bandas negras</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Filtro por categoría y orden (nuevos / más vistos)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Comentarios en cada vídeo</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sistema de reportes — 3 reportes ocultan el vídeo automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin con gestión de vídeos y categorías</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Control de permisos por rango desde <span style="font-weight: bold;" class="mycode_b">Admin → Rangos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">7 categorías por defecto (configurables desde el admin)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Instalador automático — crea todas las tablas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Diseño responsive</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">El instalador crea automáticamente:</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_videos</span> (ya incluye la columna vid_thumb)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_categorias</span> con 7 categorías por defecto</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_comentarios</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_denuncias</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Permiso <span style="font-weight: bold;" class="mycode_b">govid</span> añadido a todos los rangos</span><br />
</li>
</ul>
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
inc/php/ajax/ajax.videos.php&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/ajax/<br />
t.videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/<br />
m.video_card.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_ver.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_nuevo.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.admin_videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
videos.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/css/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En .htaccess</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba de <span style="font-weight: bold;" class="mycode_b"># FOTOS</span> agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># VIDEOS<br />
RewriteRule ^videos/&#36; inc/php/videos.php?action= [QSA,L]<br />
RewriteRule ^videos/ver/([0-9]+)/&#36; inc/php/videos.php?action=ver&amp;vid=&#36;1 [QSA,L]<br />
RewriteRule ^videos/nuevo/&#36; inc/php/videos.php?action=nuevo [QSA,L]<br />
RewriteRule ^videos/usuario/([^/]+)/&#36; inc/php/videos.php?action=usuario&amp;nick=&#36;1 [QSA,L]<br />
RewriteRule ^admin/videos&#36; inc/php/admin.php?action=videos [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
Agregar arriba:<br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'videos'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.videos.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV = new tsVideos();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['addcat']) &amp;&amp; !empty(&#36;_POST['vcat_name'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV-&gt;adminSaveCategoria();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsCore-&gt;redirectTo(&#36;tsCore-&gt;settings['url'].'/admin/videos');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;filtro = (int)(&#36;_GET['status'] ?? -1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminVideos', &#36;tsV-&gt;adminGetVideos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVCategorias', &#36;tsV-&gt;getCategorias());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVFiltro', &#36;filtro);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="font-weight: bold;" class="mycode_b">{/if}</span> final añade:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'videos'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='modules/m.admin_videos.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_rangos.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dt&gt;&lt;label for="goaf"&gt;Anti-flood&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Tiempo que deben esperar entre acci&amp;oacute;n.&lt;/span&gt;&lt;/dt&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;input type="text" id="goaf" name="global-antiflood" value="{&#36;tsRango.permisos.goaf}" style="width:30%"/&gt;&lt;/dd&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&lt;dt&gt;&lt;label for="govid"&gt;Publicar Vídeos&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Podrán publicar vídeos en el sitio.&lt;/span&gt;&lt;/dt&gt;<br />
&lt;dd&gt;&lt;input type="checkbox" id="govid" name="global-publicarvideos" {if &#36;tsRango.permisos.govid == 'on'}checked{/if} /&gt;&lt;/dd&gt;<br />
&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — En c.admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<br />
<span style="font-size: large;" class="mycode_size">En <span style="font-weight: bold;" class="mycode_b">saveRango()</span> y <span style="font-weight: bold;" class="mycode_b">newRango()</span> busca la línea:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday']);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Reemplazar por:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'govid' =&gt; &#36;_POST['global-publicarvideos'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 8 — En head_menu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;tsConfig.c_fotos_private == '1' &amp;&amp; !&#36;tsUser-&gt;is_member}{else}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="tabbed {if &#36;tsPage == 'fotos'}here{/if}" id="tabbedfotos"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Ir a Fotos" onclick="menu('fotos', this.href); return false;" href="{&#36;tsConfig.url}/fotos/"&gt;Fotos &lt;i class="fa-solid fa-caret-down"&gt;&lt;/i&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{/if}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'videos'}here{/if}" id="tabbedvideos"&gt;&lt;a title="Ir a Vídeos" href="{&#36;tsConfig.url}/videos/"&gt;Vídeos &lt;i class="fa-solid fa-film"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — Activar el permiso en los rangos</span><br />
<br />
En <span style="font-weight: bold;" class="mycode_b">Admin → Rangos → Editar</span> cada rango y activa <span style="font-weight: bold;" class="mycode_b">Publicar Vídeos</span>.</span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 10 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">📋 URLs del módulo</span></span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Portada de vídeos: <span style="font-weight: bold;" class="mycode_b">/videos/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ver vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/ver/ID/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Publicar vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/nuevo/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Vídeos de usuario: <span style="font-weight: bold;" class="mycode_b">/videos/usuario/NICK/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin: <span style="font-weight: bold;" class="mycode_b">/admin/videos</span></span><br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS v_videos, v_categorias, v_comentarios, v_denuncias;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios realizados.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenidoídeos+v1.0.rar/file" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par...0.rar/file</a><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<span style="font-size: large;" class="mycode_size">Hilo original de la v1.0: <a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a></span><br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[HIBP Password Check v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-HIBP-Password-Check-v1-0</link>
			<pubDate>Sun, 31 May 2026 19:44:47 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-HIBP-Password-Check-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">HIBP Password Check v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Verifica automáticamente si la contraseña que elige un usuario ha aparecido en filtraciones de datos conocidas, usando la API de <a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">Have I Been Pwned</a> — la base de datos más completa del mundo con más de 800 millones de contraseñas comprometidas.<br />
<br />
Si la contraseña está en la lista, se muestra un aviso y se pide al usuario que elija otra. Si la API no responde, se deja pasar sin bloquear al usuario.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔒 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Verificación en el <span style="font-weight: bold;" class="mycode_b">registro</span> y en el <span style="font-weight: bold;" class="mycode_b">cambio de contraseña</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">La contraseña <span style="font-weight: bold;" class="mycode_b">nunca sale del servidor</span> — usa k-anonymity (solo se envían los primeros 5 caracteres del hash SHA1)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Si la API no responde en 3 segundos, se deja pasar sin bloquear</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin base de datos ni instalador — solo dos cambios en PHP</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Compatible con PHP 7.4+ y 8.x</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛡️ ¿Cómo funciona la privacidad?</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">La contraseña <span style="font-weight: bold;" class="mycode_b">nunca</span> se envía a ningún servidor externo. El proceso es:</span><br />
 <br />
<ol type="1" class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Se calcula el hash SHA1 de la contraseña localmente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Solo se envían los primeros <span style="font-weight: bold;" class="mycode_b">5 caracteres</span> del hash a HIBP</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">HIBP devuelve una lista de hashes que empiezan por esos 5 caracteres</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">El servidor comprueba localmente si el hash completo está en la lista</span><br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size">Esto se llama <span style="font-weight: bold;" class="mycode_b">k-anonymity</span> y es el método oficial recomendado por HIBP</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — En c.cuenta.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadBloqueos()<br />
&nbsp;&nbsp;&nbsp;&nbsp;*/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>public static function checkHIBP(&#36;password) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;sha1&nbsp;&nbsp; = strtoupper(sha1(&#36;password));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;prefix = substr(&#36;sha1, 0, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;suffix = substr(&#36;sha1, 5);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;ctx = stream_context_create([<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'http' =&gt; [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'timeout'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 3,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ignore_errors' =&gt; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'header'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; "User-Agent: Risus-Nova-HIBP/1.0&#92;r&#92;n",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],<br />
&nbsp;&nbsp;&nbsp;&nbsp;]);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;response = @file_get_contents(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Registrate o inicia tu sesión para ver este contenido . &#36;prefix,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false, &#36;ctx<br />
&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;response === false) return false;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;foreach (explode("&#92;n", &#36;response) as &#36;line) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;parts = explode(':', trim(&#36;line));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset(&#36;parts[0]) &amp;&amp; strtoupper(&#36;parts[0]) === &#36;suffix) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (int)(&#36;parts[1] ?? 1) &gt; 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En c.cuenta.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>elseif(strlen(&#36;new_passwd) &lt; 5) return array('error' =&gt; 'Contrase&amp;ntilde;a no v&amp;aacute;lida.');</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>elseif(self::checkHIBP(&#36;new_passwd)) return array('error' =&gt; 'Esta contrase&amp;ntilde;a ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.');</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En c.registro.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code> &#36;key = defined('PASSWORD_ARGON2ID')</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar debajo:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// HIBP — Verificar contraseña filtrada<br />
if(!class_exists('tsCuenta')) require_once TS_CLASS . 'c.cuenta.php';<br />
if(tsCuenta::checkHIBP(&#36;tsData['user_password'])) return 'password: Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.';</code></div></div> <br />
<hr class="mycode_hr" />
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #3498db;" class="mycode_color">✅ Resultado</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Si el usuario intenta usar una contraseña filtrada verá:</span><br />
<blockquote class="mycode_quote"><cite>Cita:</cite>Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.</blockquote>
 <br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align">
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">HIBP Password Check v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Verifica automáticamente si la contraseña que elige un usuario ha aparecido en filtraciones de datos conocidas, usando la API de <a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">Have I Been Pwned</a> — la base de datos más completa del mundo con más de 800 millones de contraseñas comprometidas.<br />
<br />
Si la contraseña está en la lista, se muestra un aviso y se pide al usuario que elija otra. Si la API no responde, se deja pasar sin bloquear al usuario.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔒 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Verificación en el <span style="font-weight: bold;" class="mycode_b">registro</span> y en el <span style="font-weight: bold;" class="mycode_b">cambio de contraseña</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">La contraseña <span style="font-weight: bold;" class="mycode_b">nunca sale del servidor</span> — usa k-anonymity (solo se envían los primeros 5 caracteres del hash SHA1)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Si la API no responde en 3 segundos, se deja pasar sin bloquear</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin base de datos ni instalador — solo dos cambios en PHP</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Compatible con PHP 7.4+ y 8.x</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛡️ ¿Cómo funciona la privacidad?</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">La contraseña <span style="font-weight: bold;" class="mycode_b">nunca</span> se envía a ningún servidor externo. El proceso es:</span><br />
 <br />
<ol type="1" class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Se calcula el hash SHA1 de la contraseña localmente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Solo se envían los primeros <span style="font-weight: bold;" class="mycode_b">5 caracteres</span> del hash a HIBP</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">HIBP devuelve una lista de hashes que empiezan por esos 5 caracteres</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">El servidor comprueba localmente si el hash completo está en la lista</span><br />
</li>
</ol>
<br />
<span style="font-size: large;" class="mycode_size">Esto se llama <span style="font-weight: bold;" class="mycode_b">k-anonymity</span> y es el método oficial recomendado por HIBP</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — En c.cuenta.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadBloqueos()<br />
&nbsp;&nbsp;&nbsp;&nbsp;*/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>public static function checkHIBP(&#36;password) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;sha1&nbsp;&nbsp; = strtoupper(sha1(&#36;password));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;prefix = substr(&#36;sha1, 0, 5);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;suffix = substr(&#36;sha1, 5);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;ctx = stream_context_create([<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'http' =&gt; [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'timeout'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 3,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ignore_errors' =&gt; true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'header'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; "User-Agent: Risus-Nova-HIBP/1.0&#92;r&#92;n",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],<br />
&nbsp;&nbsp;&nbsp;&nbsp;]);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;response = @file_get_contents(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Registrate o inicia tu sesión para ver este contenido . &#36;prefix,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false, &#36;ctx<br />
&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;response === false) return false;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;foreach (explode("&#92;n", &#36;response) as &#36;line) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;parts = explode(':', trim(&#36;line));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset(&#36;parts[0]) &amp;&amp; strtoupper(&#36;parts[0]) === &#36;suffix) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (int)(&#36;parts[1] ?? 1) &gt; 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En c.cuenta.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>elseif(strlen(&#36;new_passwd) &lt; 5) return array('error' =&gt; 'Contrase&amp;ntilde;a no v&amp;aacute;lida.');</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>elseif(self::checkHIBP(&#36;new_passwd)) return array('error' =&gt; 'Esta contrase&amp;ntilde;a ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.');</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En c.registro.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code> &#36;key = defined('PASSWORD_ARGON2ID')</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar debajo:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// HIBP — Verificar contraseña filtrada<br />
if(!class_exists('tsCuenta')) require_once TS_CLASS . 'c.cuenta.php';<br />
if(tsCuenta::checkHIBP(&#36;tsData['user_password'])) return 'password: Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.';</code></div></div> <br />
<hr class="mycode_hr" />
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #3498db;" class="mycode_color">✅ Resultado</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Si el usuario intenta usar una contraseña filtrada verá:</span><br />
<blockquote class="mycode_quote"><cite>Cita:</cite>Esta contraseña ha aparecido en filtraciones de datos conocidas. Por seguridad elige una diferente.</blockquote>
 <br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align">
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Arcade Juegos HTML5 v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Arcade-Juegos-HTML5-v1-0</link>
			<pubDate>Sun, 31 May 2026 10:42:32 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Arcade-Juegos-HTML5-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Arcade — Juegos HTML5 v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/8IA85mX.png" loading="lazy"  alt="[Imagen: 8IA85mX.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/7Lir8ks.png" loading="lazy"  alt="[Imagen: 7Lir8ks.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/4sfUuwT.png" loading="lazy"  alt="[Imagen: 4sfUuwT.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/GDJnCv1.png" loading="lazy"  alt="[Imagen: GDJnCv1.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/i2P4f4T.png" loading="lazy"  alt="[Imagen: i2P4f4T.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/N11WMl0.png" loading="lazy"  alt="[Imagen: N11WMl0.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sección de juegos HTML5 con ranking, podio y valoraciones. Sin Flash, sin plugins — funciona en cualquier navegador moderno. Los juegos se añaden desde el panel admin pegando la URL del embed.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🎮 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Grid de juegos con imagen de portada, partidas jugadas y campeón</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Iframe seguro — solo dominios de confianza (GameDistribution, itch.io, CrazyGames...)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Chat en tiempo real por juego — habla con otros jugadores mientras juegas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Podio TOP 3 con avatares y puntuaciones por juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ranking completo con los 10 mejores de cada juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Envío de puntuación manual al terminar la partida</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Anti-flood — máximo 1 puntuación por hora por juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Valoración de 1 a 5 estrellas por juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Juegos relacionados en el sidebar</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">10 categorías por defecto configurables desde el admin</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Mejores jugadores globales (por juegos ganados)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Últimas puntuaciones enviadas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Filtros: nuevos, más jugados, mejor valorados, A-Z</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin completo — añadir, editar, ocultar, eliminar juegos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Diseño responsive</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🌐 Dónde conseguir juegos HTML5</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">GameDistribution.com</span> — Miles de juegos gratuitos con enlace embed</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">itch.io</span> — Juegos indie, muchos con iframe permitido</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">CrazyGames.com</span> — Gran variedad, enlace embed disponible</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">html5games.com</span> — Catálogo de juegos HTML5</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">gamemonetize.com</span> — Juegos gratuitos con embed</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Crea las 4 tablas y 10 categorías por defecto.</span><br />
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.arcade.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/class/<br />
inc/php/arcade.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/php/<br />
t.arcade.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
m.arcade_lista.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.arcade_jugar.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.admin_arcade.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
arcade.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/css/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Añadir rutas en .htaccess</span><br />
<br />
Arriba de <span style="font-weight: bold;" class="mycode_b"># FOTOS</span> agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># ARCADE<br />
RewriteRule ^arcade/&#36; inc/php/arcade.php?action= [QSA,L]<br />
RewriteRule ^arcade/jugar/([0-9]+)/&#36; inc/php/arcade.php?action=jugar&amp;gid=&#36;1 [QSA,L]<br />
RewriteRule ^arcade-enviar-score.php&#36; inc/php/arcade.php?action=enviar-score [QSA,L]<br />
RewriteRule ^arcade-votar.php&#36; inc/php/arcade.php?action=votar [QSA,L]<br />
RewriteRule ^arcade-admin-del.php&#36; inc/php/admin.php?action=arcade&amp;act=del [QSA,L]<br />
RewriteRule ^arcade-admin-toggle.php&#36; inc/php/admin.php?action=arcade&amp;act=toggle [QSA,L]<br />
RewriteRule ^arcade-admin-delcat.php&#36; inc/php/admin.php?action=arcade&amp;act=delcat [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'arcade'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.arcade.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsArc = new tsArcade();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;act = &#36;tsCore-&gt;setSecure(&#36;_GET['act'] ?? '');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeAct', &#36;act);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsArcadeCats', &#36;tsArc-&gt;getCategorias());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;act == 'save') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;msg = &#36;tsArc-&gt;adminSaveJuego();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeMsg', &#36;msg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeAct', 'lista');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeJuegos', &#36;tsArc-&gt;adminGetJuegos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;} elseif (&#36;act == 'editar') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;gid = (int)(&#36;_GET['gid'] ?? 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;juego = db_exec('fetch_assoc', db_exec([__FILE__,__LINE__],'query',"SELECT * FROM g_juegos WHERE game_id='&#36;gid' LIMIT 1"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeJuego', &#36;juego);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} elseif (&#36;act == 'addcat') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsArc-&gt;adminSaveCategoria();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsCore-&gt;redirectTo(&#36;tsCore-&gt;settings['url'].'/admin/arcade?act=categorias');<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeJuegos', &#36;tsArc-&gt;adminGetJuegos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span> al final antes de <span style="font-weight: bold;" class="mycode_b">{/if}</span>:</span><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'arcade'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='modules/m.admin_arcade.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — Añadir en el menú</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'arcade'}here{/if}" id="tabbedarcade"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Arcade" href="{&#36;tsConfig.url}/arcade/"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arcade &lt;i class="fa-solid fa-gamepad"&gt;&lt;/i&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/a&gt;<br />
&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — En main_header.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">link&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">css</span><span style="color: #007700">}</span><span style="color: #DD0000">/</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsPage</span><span style="color: #007700">}</span><span style="color: #DD0000">.css"&nbsp;</span><span style="color: #0000BB">rel</span><span style="color: #007700">=</span><span style="color: #DD0000">"stylesheet"&nbsp;</span><span style="color: #0000BB">type</span><span style="color: #007700">=</span><span style="color: #DD0000">"text/css"</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;tsPage == 'arcade'}<br />
&lt;link rel="stylesheet" href="{&#36;tsConfig.default}/css/arcade.css"/&gt;<br />
{/if}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 8 — En m.admin_sidemenu.tpl agregan esto donde quieran:</span></span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/admin/arcade"</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"fa-solid&nbsp;fa-gamepad"</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">i</span><span style="color: #007700">&gt;&nbsp;</span><span style="color: #0000BB">Arcade</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — En head_menu.tpl buscar:</span></span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"tabbed&nbsp;{if&nbsp;</span><span style="color: #0000BB">&#36;tsPage</span><span style="color: #DD0000">&nbsp;==&nbsp;'tops'}here{/if}"&nbsp;</span><span style="color: #0000BB">id</span><span style="color: #007700">=</span><span style="color: #DD0000">"tabbedtops"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">a&nbsp;title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Ir&nbsp;a&nbsp;TOPs"&nbsp;</span><span style="color: #0000BB">onclick</span><span style="color: #007700">=</span><span style="color: #DD0000">"menu('tops',&nbsp;this.href);&nbsp;return&nbsp;false;"&nbsp;</span><span style="color: #0000BB">href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/top/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">TOPs&nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"fa-solid&nbsp;fa-caret-down"</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">i</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"tabbed&nbsp;{if&nbsp;</span><span style="color: #0000BB">&#36;tsPage</span><span style="color: #DD0000">&nbsp;==&nbsp;'arcade'}here{/if}"&nbsp;</span><span style="color: #0000BB">id</span><span style="color: #007700">=</span><span style="color: #DD0000">"tabbedarcade"</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">a&nbsp;title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Arcade"&nbsp;</span><span style="color: #0000BB">href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/arcade/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Arcade&nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"fa-solid&nbsp;fa-gamepad"</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">i</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 10 — Añadir tu primer juego</span><br />
<br />
Ve a <span style="font-weight: bold;" class="mycode_b">Admin → Arcade → Añadir juego</span> y pega la URL de embed de GameDistribution.</span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span>.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS g_juegos, g_categorias, g_scores, g_votos;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios.</span><br />
<hr class="mycode_hr" />
 <br />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Arcade — Juegos HTML5 v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/8IA85mX.png" loading="lazy"  alt="[Imagen: 8IA85mX.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/7Lir8ks.png" loading="lazy"  alt="[Imagen: 7Lir8ks.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/4sfUuwT.png" loading="lazy"  alt="[Imagen: 4sfUuwT.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/GDJnCv1.png" loading="lazy"  alt="[Imagen: GDJnCv1.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/i2P4f4T.png" loading="lazy"  alt="[Imagen: i2P4f4T.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/N11WMl0.png" loading="lazy"  alt="[Imagen: N11WMl0.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sección de juegos HTML5 con ranking, podio y valoraciones. Sin Flash, sin plugins — funciona en cualquier navegador moderno. Los juegos se añaden desde el panel admin pegando la URL del embed.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🎮 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Grid de juegos con imagen de portada, partidas jugadas y campeón</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Iframe seguro — solo dominios de confianza (GameDistribution, itch.io, CrazyGames...)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Chat en tiempo real por juego — habla con otros jugadores mientras juegas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Podio TOP 3 con avatares y puntuaciones por juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ranking completo con los 10 mejores de cada juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Envío de puntuación manual al terminar la partida</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Anti-flood — máximo 1 puntuación por hora por juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Valoración de 1 a 5 estrellas por juego</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Juegos relacionados en el sidebar</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">10 categorías por defecto configurables desde el admin</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Mejores jugadores globales (por juegos ganados)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Últimas puntuaciones enviadas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Filtros: nuevos, más jugados, mejor valorados, A-Z</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin completo — añadir, editar, ocultar, eliminar juegos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Diseño responsive</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🌐 Dónde conseguir juegos HTML5</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">GameDistribution.com</span> — Miles de juegos gratuitos con enlace embed</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">itch.io</span> — Juegos indie, muchos con iframe permitido</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">CrazyGames.com</span> — Gran variedad, enlace embed disponible</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">html5games.com</span> — Catálogo de juegos HTML5</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">gamemonetize.com</span> — Juegos gratuitos con embed</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Crea las 4 tablas y 10 categorías por defecto.</span><br />
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.arcade.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/class/<br />
inc/php/arcade.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/php/<br />
t.arcade.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/<br />
m.arcade_lista.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.arcade_jugar.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.admin_arcade.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
arcade.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/css/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Añadir rutas en .htaccess</span><br />
<br />
Arriba de <span style="font-weight: bold;" class="mycode_b"># FOTOS</span> agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># ARCADE<br />
RewriteRule ^arcade/&#36; inc/php/arcade.php?action= [QSA,L]<br />
RewriteRule ^arcade/jugar/([0-9]+)/&#36; inc/php/arcade.php?action=jugar&amp;gid=&#36;1 [QSA,L]<br />
RewriteRule ^arcade-enviar-score.php&#36; inc/php/arcade.php?action=enviar-score [QSA,L]<br />
RewriteRule ^arcade-votar.php&#36; inc/php/arcade.php?action=votar [QSA,L]<br />
RewriteRule ^arcade-admin-del.php&#36; inc/php/admin.php?action=arcade&amp;act=del [QSA,L]<br />
RewriteRule ^arcade-admin-toggle.php&#36; inc/php/admin.php?action=arcade&amp;act=toggle [QSA,L]<br />
RewriteRule ^arcade-admin-delcat.php&#36; inc/php/admin.php?action=arcade&amp;act=delcat [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'arcade'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.arcade.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsArc = new tsArcade();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;act = &#36;tsCore-&gt;setSecure(&#36;_GET['act'] ?? '');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeAct', &#36;act);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsArcadeCats', &#36;tsArc-&gt;getCategorias());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;act == 'save') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;msg = &#36;tsArc-&gt;adminSaveJuego();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeMsg', &#36;msg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeAct', 'lista');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeJuegos', &#36;tsArc-&gt;adminGetJuegos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;} elseif (&#36;act == 'editar') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;gid = (int)(&#36;_GET['gid'] ?? 0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;juego = db_exec('fetch_assoc', db_exec([__FILE__,__LINE__],'query',"SELECT * FROM g_juegos WHERE game_id='&#36;gid' LIMIT 1"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeJuego', &#36;juego);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} elseif (&#36;act == 'addcat') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsArc-&gt;adminSaveCategoria();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsCore-&gt;redirectTo(&#36;tsCore-&gt;settings['url'].'/admin/arcade?act=categorias');<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminArcadeJuegos', &#36;tsArc-&gt;adminGetJuegos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span> al final antes de <span style="font-weight: bold;" class="mycode_b">{/if}</span>:</span><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'arcade'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='modules/m.admin_arcade.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — Añadir en el menú</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'arcade'}here{/if}" id="tabbedarcade"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Arcade" href="{&#36;tsConfig.url}/arcade/"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arcade &lt;i class="fa-solid fa-gamepad"&gt;&lt;/i&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/a&gt;<br />
&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — En main_header.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">link&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">css</span><span style="color: #007700">}</span><span style="color: #DD0000">/</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsPage</span><span style="color: #007700">}</span><span style="color: #DD0000">.css"&nbsp;</span><span style="color: #0000BB">rel</span><span style="color: #007700">=</span><span style="color: #DD0000">"stylesheet"&nbsp;</span><span style="color: #0000BB">type</span><span style="color: #007700">=</span><span style="color: #DD0000">"text/css"</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;tsPage == 'arcade'}<br />
&lt;link rel="stylesheet" href="{&#36;tsConfig.default}/css/arcade.css"/&gt;<br />
{/if}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 8 — En m.admin_sidemenu.tpl agregan esto donde quieran:</span></span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">a&nbsp;href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/admin/arcade"</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"fa-solid&nbsp;fa-gamepad"</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">i</span><span style="color: #007700">&gt;&nbsp;</span><span style="color: #0000BB">Arcade</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — En head_menu.tpl buscar:</span></span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"tabbed&nbsp;{if&nbsp;</span><span style="color: #0000BB">&#36;tsPage</span><span style="color: #DD0000">&nbsp;==&nbsp;'tops'}here{/if}"&nbsp;</span><span style="color: #0000BB">id</span><span style="color: #007700">=</span><span style="color: #DD0000">"tabbedtops"</span><span style="color: #007700">&gt;<br />&lt;</span><span style="color: #0000BB">a&nbsp;title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Ir&nbsp;a&nbsp;TOPs"&nbsp;</span><span style="color: #0000BB">onclick</span><span style="color: #007700">=</span><span style="color: #DD0000">"menu('tops',&nbsp;this.href);&nbsp;return&nbsp;false;"&nbsp;</span><span style="color: #0000BB">href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/top/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">TOPs&nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"fa-solid&nbsp;fa-caret-down"</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">i</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;<br />&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"tabbed&nbsp;{if&nbsp;</span><span style="color: #0000BB">&#36;tsPage</span><span style="color: #DD0000">&nbsp;==&nbsp;'arcade'}here{/if}"&nbsp;</span><span style="color: #0000BB">id</span><span style="color: #007700">=</span><span style="color: #DD0000">"tabbedarcade"</span><span style="color: #007700">&gt;&lt;</span><span style="color: #0000BB">a&nbsp;title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Arcade"&nbsp;</span><span style="color: #0000BB">href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/arcade/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Arcade&nbsp;</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">class=</span><span style="color: #DD0000">"fa-solid&nbsp;fa-gamepad"</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">i</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 10 — Añadir tu primer juego</span><br />
<br />
Ve a <span style="font-weight: bold;" class="mycode_b">Admin → Arcade → Añadir juego</span> y pega la URL de embed de GameDistribution.</span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span>.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS g_juegos, g_categorias, g_scores, g_votos;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios.</span><br />
<hr class="mycode_hr" />
 <br />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Sección Destacados v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Secci%C3%B3n-Destacados-v1-0</link>
			<pubDate>Sat, 30 May 2026 23:43:09 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Secci%C3%B3n-Destacados-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Sección Destacados v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/A5lr6Cg.png" loading="lazy"  alt="[Imagen: A5lr6Cg.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/iYINsWJ.png" loading="lazy"  alt="[Imagen: iYINsWJ.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sección dedicada a los posts más votados y comentados de la comunidad. Inspirado en la sección Destacados de Taringa.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⭐ Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Posts más votados, más comentados o más recientes (filtro)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Badge 🔥 Hot para posts con 50+ puntos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Estadísticas rápidas en la cabecera (total destacados, máximo puntos, posts hoy)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Posts fijados en la parte superior</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">TOP Posts y TOP Usuarios con filtros: Hoy, Semana, Mes, Histórico</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.destacados.php →&nbsp;&nbsp;inc/class/<br />
inc/php/destacados.php →&nbsp;&nbsp;inc/php/<br />
t.destacados.tpl →&nbsp;&nbsp;themes/default/templates/<br />
themes/default/templates/modules/m.destacados_tops.tpl →&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En .htaccess</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar <span style="font-weight: bold;" class="mycode_b"># ADMIN</span> y arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># DESTACADOS<br />
RewriteRule ^destacados/&#36; inc/php/destacados.php?action= [QSA,L]<br />
RewriteRule ^destacados/tops/&#36; inc/php/destacados.php?action=tops [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En head_submenu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li</span><span style="color: #007700">{if&nbsp;</span><span style="color: #0000BB">&#36;tsPage&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">'buscador'</span><span style="color: #007700">}&nbsp;class=</span><span style="color: #DD0000">"here"</span><span style="color: #007700">{/if}&gt;&lt;</span><span style="color: #0000BB">a&nbsp;</span><span style="color: #007700">class=</span><span style="color: #0000BB">vctip&nbsp;title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Buscador"&nbsp;</span><span style="color: #0000BB">href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/buscador/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Buscador</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li{if &#36;tsPage == 'destacados'} class="here"{/if}&gt;&lt;a class=vctip title="Sección Destacados" href="{&#36;tsConfig.url}/destacados/"&gt;&lt;i class="fa-solid fa-star"&gt;&lt;/i&gt; Destacados&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span><br />
<br />
Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e67e22;" class="mycode_color">⚙️ Ajustar el badge Hot</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">En <span style="font-weight: bold;" class="mycode_b">t.destacados.tpl</span> busca:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;p.post_puntos &gt;= 50}</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Cambia el <span style="font-weight: bold;" class="mycode_b">50</span> por el número de puntos que quieras.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e67e22;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">.htaccess</span> y <span style="font-weight: bold;" class="mycode_b">head_submenu.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Sección Destacados v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/A5lr6Cg.png" loading="lazy"  alt="[Imagen: A5lr6Cg.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/iYINsWJ.png" loading="lazy"  alt="[Imagen: iYINsWJ.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sección dedicada a los posts más votados y comentados de la comunidad. Inspirado en la sección Destacados de Taringa.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⭐ Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Posts más votados, más comentados o más recientes (filtro)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Badge 🔥 Hot para posts con 50+ puntos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Estadísticas rápidas en la cabecera (total destacados, máximo puntos, posts hoy)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Posts fijados en la parte superior</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">TOP Posts y TOP Usuarios con filtros: Hoy, Semana, Mes, Histórico</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.destacados.php →&nbsp;&nbsp;inc/class/<br />
inc/php/destacados.php →&nbsp;&nbsp;inc/php/<br />
t.destacados.tpl →&nbsp;&nbsp;themes/default/templates/<br />
themes/default/templates/modules/m.destacados_tops.tpl →&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En .htaccess</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar <span style="font-weight: bold;" class="mycode_b"># ADMIN</span> y arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># DESTACADOS<br />
RewriteRule ^destacados/&#36; inc/php/destacados.php?action= [QSA,L]<br />
RewriteRule ^destacados/tops/&#36; inc/php/destacados.php?action=tops [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En head_submenu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #007700">&lt;</span><span style="color: #0000BB">li</span><span style="color: #007700">{if&nbsp;</span><span style="color: #0000BB">&#36;tsPage&nbsp;</span><span style="color: #007700">==&nbsp;</span><span style="color: #DD0000">'buscador'</span><span style="color: #007700">}&nbsp;class=</span><span style="color: #DD0000">"here"</span><span style="color: #007700">{/if}&gt;&lt;</span><span style="color: #0000BB">a&nbsp;</span><span style="color: #007700">class=</span><span style="color: #0000BB">vctip&nbsp;title</span><span style="color: #007700">=</span><span style="color: #DD0000">"Buscador"&nbsp;</span><span style="color: #0000BB">href</span><span style="color: #007700">=</span><span style="color: #DD0000">"</span><span style="color: #007700">{</span><span style="color: #0000BB">&#36;tsConfig</span><span style="color: #007700">.</span><span style="color: #0000BB">url</span><span style="color: #007700">}</span><span style="color: #DD0000">/buscador/"</span><span style="color: #007700">&gt;</span><span style="color: #0000BB">Buscador</span><span style="color: #007700">&lt;/</span><span style="color: #0000BB">a</span><span style="color: #007700">&gt;&lt;/</span><span style="color: #0000BB">li</span><span style="color: #007700">&gt;&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li{if &#36;tsPage == 'destacados'} class="here"{/if}&gt;&lt;a class=vctip title="Sección Destacados" href="{&#36;tsConfig.url}/destacados/"&gt;&lt;i class="fa-solid fa-star"&gt;&lt;/i&gt; Destacados&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span><br />
<br />
Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e67e22;" class="mycode_color">⚙️ Ajustar el badge Hot</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">En <span style="font-weight: bold;" class="mycode_b">t.destacados.tpl</span> busca:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;p.post_puntos &gt;= 50}</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Cambia el <span style="font-weight: bold;" class="mycode_b">50</span> por el número de puntos que quieras.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e67e22;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">.htaccess</span> y <span style="font-weight: bold;" class="mycode_b">head_submenu.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Honeypot Anti-Spam v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Honeypot-Anti-Spam-v1-0</link>
			<pubDate>Sat, 30 May 2026 19:51:31 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Honeypot-Anti-Spam-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Honeypot Anti-Spam v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Campo trampa invisible para bloquear bots de spam en el registro. Los usuarios normales nunca lo ven. Los bots que rellenan todos los campos automáticamente quedan bloqueados.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🍯 Cómo funciona</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Se añade un campo de texto oculto con CSS en el formulario de registro</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Los usuarios normales nunca lo ven ni lo rellenan</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Los bots de spam rellenan todos los campos automáticamente, incluido el oculto</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Si el campo llega relleno al servidor → bot detectado → registro bloqueado silenciosamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">No molesta a los usuarios reales</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Compatible con Cloudflare Turnstile — doble protección</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir el archivo</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>p.registro.form.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/php_files/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En c.registro.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// COMPROBAR NUEVAMENTE QUE EL USUARIO O EMAIL NO SE ENCUENTREN REGISTRADOS</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Honeypot anti-bot ──<br />
if (!empty(&#36;_POST['website'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return '1';<br />
}<br />
// ──────────────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">⚠️ Importante</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">No elimines el comentario <span style="font-weight: bold;" class="mycode_b">&lt;!-- Honeypot --&gt;</span> del formulario</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">No cambies el nombre del campo <span style="font-weight: bold;" class="mycode_b">website</span> sin actualizarlo también en <span style="font-weight: bold;" class="mycode_b">c.registro.php</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Devuelve <span style="font-weight: bold;" class="mycode_b">'1'</span> (éxito falso) en lugar de error para no alertar al bot</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Honeypot Anti-Spam v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Campo trampa invisible para bloquear bots de spam en el registro. Los usuarios normales nunca lo ven. Los bots que rellenan todos los campos automáticamente quedan bloqueados.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🍯 Cómo funciona</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Se añade un campo de texto oculto con CSS en el formulario de registro</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Los usuarios normales nunca lo ven ni lo rellenan</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Los bots de spam rellenan todos los campos automáticamente, incluido el oculto</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Si el campo llega relleno al servidor → bot detectado → registro bloqueado silenciosamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">No molesta a los usuarios reales</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Compatible con Cloudflare Turnstile — doble protección</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir el archivo</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>p.registro.form.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/php_files/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En c.registro.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// COMPROBAR NUEVAMENTE QUE EL USUARIO O EMAIL NO SE ENCUENTREN REGISTRADOS</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Honeypot anti-bot ──<br />
if (!empty(&#36;_POST['website'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return '1';<br />
}<br />
// ──────────────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">⚠️ Importante</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">No elimines el comentario <span style="font-weight: bold;" class="mycode_b">&lt;!-- Honeypot --&gt;</span> del formulario</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">No cambies el nombre del campo <span style="font-weight: bold;" class="mycode_b">website</span> sin actualizarlo también en <span style="font-weight: bold;" class="mycode_b">c.registro.php</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Devuelve <span style="font-weight: bold;" class="mycode_b">'1'</span> (éxito falso) en lugar de error para no alertar al bot</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Sección Novatos v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Secci%C3%B3n-Novatos-v1-0</link>
			<pubDate>Sat, 30 May 2026 19:13:07 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Secci%C3%B3n-Novatos-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Sección Novatos v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/FOmu2jo.png" loading="lazy"  alt="[Imagen: FOmu2jo.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/6ZjGTnR.png" loading="lazy"  alt="[Imagen: 6ZjGTnR.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sección dedicada a los usuarios novatos con sus posts y un TOP propio. Inspirado en la sección Novatos de Taringa. Reescrito desde cero para Risus Nova 2.0.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🌱 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Página propia en <span style="font-weight: bold;" class="mycode_b">/novatos/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Posts de usuarios con rango Novato paginados</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Posts fijados de novatos en la parte superior</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">TOP Posts y TOP Usuarios novatos con filtros: Hoy, Semana, Mes, Histórico</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Enlace en el menú principal</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.novatos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/novatos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
t.novatos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/<br />
themes/default/templates/modules/m.novatos_tops.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En .htaccess arriba de <span style="color: #e74c3c;" class="mycode_color"># FOTOS</span> agregar esto:</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># NOVATOS<br />
RewriteRule ^novatos/&#36; inc/php/novatos.php?action= [QSA,L]<br />
RewriteRule ^novatos/tops/&#36; inc/php/novatos.php?action=tops [QSA,L]</code></div></div><br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En head_submenu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li{if &#36;tsPage == 'buscador'} class="here"{/if}&gt;&lt;a class=vctip title="Buscador" href="{&#36;tsConfig.url}/buscador/"&gt;Buscador&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar antes:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li{if &#36;tsPage == 'novatos'} class="here"{/if}&gt;&lt;a class=vctip title="Sección Novatos" href="{&#36;tsConfig.url}/novatos/"&gt;&lt;i class="fa-solid fa-seedling"&gt;&lt;/i&gt; Novatos&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #27ae60;" class="mycode_color">⚙️ Cambiar el rango novato</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Si el rango novato en tu BD tiene un <span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">ID</span></span> diferente al <span style="color: #e74c3c;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">3</span></span>, abre <span style="color: #e74c3c;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">c.novatos.php</span></span> y cambia:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>const RANGO_NOVATO = 3;</code></div></div> <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">.htaccess</span> y <span style="font-weight: bold;" class="mycode_b">head_menu.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Sección Novatos v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/FOmu2jo.png" loading="lazy"  alt="[Imagen: FOmu2jo.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/6ZjGTnR.png" loading="lazy"  alt="[Imagen: 6ZjGTnR.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sección dedicada a los usuarios novatos con sus posts y un TOP propio. Inspirado en la sección Novatos de Taringa. Reescrito desde cero para Risus Nova 2.0.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🌱 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Página propia en <span style="font-weight: bold;" class="mycode_b">/novatos/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Posts de usuarios con rango Novato paginados</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Posts fijados de novatos en la parte superior</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">TOP Posts y TOP Usuarios novatos con filtros: Hoy, Semana, Mes, Histórico</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Enlace en el menú principal</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.novatos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/novatos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
t.novatos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/<br />
themes/default/templates/modules/m.novatos_tops.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En .htaccess arriba de <span style="color: #e74c3c;" class="mycode_color"># FOTOS</span> agregar esto:</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># NOVATOS<br />
RewriteRule ^novatos/&#36; inc/php/novatos.php?action= [QSA,L]<br />
RewriteRule ^novatos/tops/&#36; inc/php/novatos.php?action=tops [QSA,L]</code></div></div><br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En head_submenu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li{if &#36;tsPage == 'buscador'} class="here"{/if}&gt;&lt;a class=vctip title="Buscador" href="{&#36;tsConfig.url}/buscador/"&gt;Buscador&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar antes:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li{if &#36;tsPage == 'novatos'} class="here"{/if}&gt;&lt;a class=vctip title="Sección Novatos" href="{&#36;tsConfig.url}/novatos/"&gt;&lt;i class="fa-solid fa-seedling"&gt;&lt;/i&gt; Novatos&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #27ae60;" class="mycode_color">⚙️ Cambiar el rango novato</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Si el rango novato en tu BD tiene un <span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">ID</span></span> diferente al <span style="color: #e74c3c;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">3</span></span>, abre <span style="color: #e74c3c;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">c.novatos.php</span></span> y cambia:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>const RANGO_NOVATO = 3;</code></div></div> <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">.htaccess</span> y <span style="font-weight: bold;" class="mycode_b">head_menu.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Shoutbox v2.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Shoutbox-v2-0</link>
			<pubDate>Sat, 30 May 2026 15:15:21 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Shoutbox-v2-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Shoutbox v2.0</span></span><br />
<span style="font-size: large;" class="mycode_size">Reescrito desde cero para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/tBh9fbP.png" loading="lazy"  alt="[Imagen: tBh9fbP.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Shoutbox moderno reescrito completamente desde cero. Sin dependencias antiguas, con anti-flood, actualización automática cada 15 segundos y diseño limpio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">💬 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Actualización automática cada <span style="font-weight: bold;" class="mycode_b">15 segundos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Anti-flood — 10 segundos entre mensajes</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Máximo 200 caracteres por mensaje</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Solo usuarios registrados pueden escribir</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Visitantes ven los mensajes pero no pueden escribir</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Borrar mensaje propio con un clic</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Admins pueden borrar cualquier mensaje</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin dependencias antiguas (sin shadowbox, sin markItUp)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Compatible con PHP 8.3 y Risus Nova 2.0</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: x-large;" class="mycode_size">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.shoutbox.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/class/<br />
inc/php/ajax/ajax.shoutbox.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/php/ajax/<br />
themes/default/templates/modules/m.home_shoutbox.tpl&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
themes/default/templates/modules/m.shout_item.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En t.home.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar donde quieran colocarlo en la columna centro o derecha:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.home_shoutbox.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En posts.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;smarty-&gt;assign("tsTopcat",&#36;tsPosts-&gt;topcat());</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar debajo:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Shoutbox ──<br />
require_once TS_CLASS . 'c.shoutbox.php';<br />
&#36;tsSB = new tsShoutbox();<br />
&#36;smarty-&gt;assign('tsShouts', &#36;tsSB-&gt;getShouts());<br />
// ──────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Borrar la caché</span><br />
<br />
Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚙️ Configurar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Abre <span style="font-weight: bold;" class="mycode_b">inc/class/c.shoutbox.php</span> y edita las constantes al principio:</span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">MAX_LEN</span> = 200 — máximo caracteres por mensaje</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ANTIFLOOD</span> = 10 — segundos entre mensajes</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">MAX_SHOUTS</span> = 20 — número de mensajes visibles</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #3498db;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS w_shoutbox;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">posts.php</span> y <span style="font-weight: bold;" class="mycode_b">t.home.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Shoutbox v2.0</span></span><br />
<span style="font-size: large;" class="mycode_size">Reescrito desde cero para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/tBh9fbP.png" loading="lazy"  alt="[Imagen: tBh9fbP.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Shoutbox moderno reescrito completamente desde cero. Sin dependencias antiguas, con anti-flood, actualización automática cada 15 segundos y diseño limpio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">💬 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Actualización automática cada <span style="font-weight: bold;" class="mycode_b">15 segundos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Anti-flood — 10 segundos entre mensajes</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Máximo 200 caracteres por mensaje</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Solo usuarios registrados pueden escribir</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Visitantes ven los mensajes pero no pueden escribir</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Borrar mensaje propio con un clic</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Admins pueden borrar cualquier mensaje</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin dependencias antiguas (sin shadowbox, sin markItUp)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Compatible con PHP 8.3 y Risus Nova 2.0</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: x-large;" class="mycode_size">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.shoutbox.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/class/<br />
inc/php/ajax/ajax.shoutbox.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/php/ajax/<br />
themes/default/templates/modules/m.home_shoutbox.tpl&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
themes/default/templates/modules/m.shout_item.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En t.home.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar donde quieran colocarlo en la columna centro o derecha:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.home_shoutbox.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En posts.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;smarty-&gt;assign("tsTopcat",&#36;tsPosts-&gt;topcat());</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar debajo:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Shoutbox ──<br />
require_once TS_CLASS . 'c.shoutbox.php';<br />
&#36;tsSB = new tsShoutbox();<br />
&#36;smarty-&gt;assign('tsShouts', &#36;tsSB-&gt;getShouts());<br />
// ──────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Borrar la caché</span><br />
<br />
Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚙️ Configurar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Abre <span style="font-weight: bold;" class="mycode_b">inc/class/c.shoutbox.php</span> y edita las constantes al principio:</span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">MAX_LEN</span> = 200 — máximo caracteres por mensaje</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">ANTIFLOOD</span> = 10 — segundos entre mensajes</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">MAX_SHOUTS</span> = 20 — número de mensajes visibles</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #3498db;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS w_shoutbox;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">posts.php</span> y <span style="font-weight: bold;" class="mycode_b">t.home.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Tendencias y Destacados v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Tendencias-y-Destacados-v1-0</link>
			<pubDate>Sat, 30 May 2026 14:11:35 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Tendencias-y-Destacados-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Tendencias y Destacados v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/yfeBwNo.png" loading="lazy"  alt="[Imagen: yfeBwNo.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Dos widgets para el sidebar de la portada: hashtags trending de las últimas 24h estilo Twitter y posts fijados por el admin.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔥 Características</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Tendencias (#hashtags)</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tags más usados en las últimas 24h</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tamaño proporcional al número de posts — más grande = más trending</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Clic en el tag busca posts con ese tag</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva — usa post_tags existente</span><br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Destacados (📌 PIN)</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Posts marcados como sticky por el admin</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra título, comentarios, puntos y fecha</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">El admin fija posts desde <span style="font-weight: bold;" class="mycode_b">Moderar Post → Sticky</span></span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.trending.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
themes/default/templates/modules/m.home_trending.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
themes/default/templates/modules/m.home_pins.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En posts.php buscar:</span></span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&#36;smarty</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">assign</span><span style="color: #007700">(</span><span style="color: #DD0000">"tsTopcat"</span><span style="color: #007700">,</span><span style="color: #0000BB">&#36;tsPosts</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">topcat</span><span style="color: #007700">());<br />}<br /><br />}&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Reemplazar por:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;smarty-&gt;assign("tsTopcat",&#36;tsPosts-&gt;topcat());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TRENDING Y PINS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.trending.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsTrend = new tsTrending();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsTrendingTags', &#36;tsTrend-&gt;getTrendingTags(24, 15));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsPinnedPosts',&nbsp;&nbsp;&#36;tsTrend-&gt;getPinnedPosts(5));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En t.home.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.home_tags_relevantes.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.home_pins.tpl'}<br />
{include file='modules/m.home_trending.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚙️ Configurar</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Fijar un post</span> — abre cualquier post y usa <span style="font-weight: bold;" class="mycode_b">Moderar Post → Sticky</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Cambiar las horas</span> del trending — cambia el <span style="font-weight: bold;" class="mycode_b">24</span> en <span style="font-weight: bold;" class="mycode_b">getTrendingTags(24, 15)</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Cambiar número de pins</span> — cambia el <span style="font-weight: bold;" class="mycode_b">5</span> en <span style="font-weight: bold;" class="mycode_b">getPinnedPosts(5)</span></span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en el controlador y <span style="font-weight: bold;" class="mycode_b">t.home.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Tendencias y Destacados v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/yfeBwNo.png" loading="lazy"  alt="[Imagen: yfeBwNo.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Dos widgets para el sidebar de la portada: hashtags trending de las últimas 24h estilo Twitter y posts fijados por el admin.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔥 Características</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Tendencias (#hashtags)</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tags más usados en las últimas 24h</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tamaño proporcional al número de posts — más grande = más trending</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Clic en el tag busca posts con ese tag</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva — usa post_tags existente</span><br />
</li>
</ul>
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Destacados (📌 PIN)</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Posts marcados como sticky por el admin</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra título, comentarios, puntos y fecha</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">El admin fija posts desde <span style="font-weight: bold;" class="mycode_b">Moderar Post → Sticky</span></span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.trending.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
themes/default/templates/modules/m.home_trending.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
themes/default/templates/modules/m.home_pins.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En posts.php buscar:</span></span><br />
 <br />
<div class="codeblock phpcodeblock"><div class="title">Código PHP:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">&#36;smarty</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">assign</span><span style="color: #007700">(</span><span style="color: #DD0000">"tsTopcat"</span><span style="color: #007700">,</span><span style="color: #0000BB">&#36;tsPosts</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">topcat</span><span style="color: #007700">());<br />}<br /><br />}&nbsp;<br /></span></code></div></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Reemplazar por:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;smarty-&gt;assign("tsTopcat",&#36;tsPosts-&gt;topcat());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TRENDING Y PINS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.trending.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsTrend = new tsTrending();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsTrendingTags', &#36;tsTrend-&gt;getTrendingTags(24, 15));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsPinnedPosts',&nbsp;&nbsp;&#36;tsTrend-&gt;getPinnedPosts(5));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En t.home.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.home_tags_relevantes.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.home_pins.tpl'}<br />
{include file='modules/m.home_trending.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚙️ Configurar</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Fijar un post</span> — abre cualquier post y usa <span style="font-weight: bold;" class="mycode_b">Moderar Post → Sticky</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Cambiar las horas</span> del trending — cambia el <span style="font-weight: bold;" class="mycode_b">24</span> en <span style="font-weight: bold;" class="mycode_b">getTrendingTags(24, 15)</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Cambiar número de pins</span> — cambia el <span style="font-weight: bold;" class="mycode_b">5</span> en <span style="font-weight: bold;" class="mycode_b">getPinnedPosts(5)</span></span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en el controlador y <span style="font-weight: bold;" class="mycode_b">t.home.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Vídeos v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-V%C3%ADdeos-v1-0</link>
			<pubDate>Sat, 30 May 2026 11:41:40 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-V%C3%ADdeos-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Vídeos v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/gJTMPf4.png" loading="lazy"  alt="[Imagen: gJTMPf4.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ZclVYr0.png" loading="lazy"  alt="[Imagen: ZclVYr0.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/90QpwV8.gif" loading="lazy"  alt="[Imagen: 90QpwV8.gif]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/myHy84a.png" loading="lazy"  alt="[Imagen: myHy84a.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ooClT4Q.png" loading="lazy"  alt="[Imagen: ooClT4Q.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/nDTNOSA.png" loading="lazy"  alt="[Imagen: nDTNOSA.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/saRfQjS.png" loading="lazy"  alt="[Imagen: saRfQjS.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/mK8CawO.png" loading="lazy"  alt="[Imagen: mK8CawO.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sistema completo de vídeos hecho desde cero para Risus Nova 2.0. Soporta YouTube y Vimeo, con comentarios, reportes, panel admin y control de permisos por rango.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🎬 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Soporte para <span style="font-weight: bold;" class="mycode_b">YouTube</span> y <span style="font-weight: bold;" class="mycode_b">Vimeo</span> — pegar la URL y se genera el reproductor automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Grid de tarjetas con miniatura de YouTube sin bandas negras</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Filtro por categoría y orden (nuevos / más vistos)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Comentarios en cada vídeo</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sistema de reportes — 3 reportes ocultan el vídeo automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin con gestión de vídeos y categorías</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Control de permisos por rango desde <span style="font-weight: bold;" class="mycode_b">Admin → Rangos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">7 categorías por defecto (configurables desde el admin)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Instalador automático — crea todas las tablas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Diseño responsive</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">El instalador crea automáticamente:</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_videos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_categorias</span> con 7 categorías por defecto</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_comentarios</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_denuncias</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Permiso <span style="font-weight: bold;" class="mycode_b">govid</span> añadido a todos los rangos</span><br />
</li>
</ul>
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
inc/php/ajax/ajax.videos.php&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/ajax/<br />
t.videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/<br />
m.video_card.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_ver.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_nuevo.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.admin_videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
videos.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/css/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En .htaccess</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba de <span style="font-weight: bold;" class="mycode_b"># FOTOS</span> agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># VIDEOS<br />
RewriteRule ^videos/&#36; inc/php/videos.php?action= [QSA,L]<br />
RewriteRule ^videos/ver/([0-9]+)/&#36; inc/php/videos.php?action=ver&amp;vid=&#36;1 [QSA,L]<br />
RewriteRule ^videos/nuevo/&#36; inc/php/videos.php?action=nuevo [QSA,L]<br />
RewriteRule ^videos/usuario/([^/]+)/&#36; inc/php/videos.php?action=usuario&amp;nick=&#36;1 [QSA,L]<br />
RewriteRule ^admin/videos&#36; inc/php/admin.php?action=videos [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
Agregar arriba:<br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'videos'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.videos.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV = new tsVideos();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['addcat']) &amp;&amp; !empty(&#36;_POST['vcat_name'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV-&gt;adminSaveCategoria();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsCore-&gt;redirectTo(&#36;tsCore-&gt;settings['url'].'/admin/videos');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;filtro = (int)(&#36;_GET['status'] ?? -1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminVideos', &#36;tsV-&gt;adminGetVideos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVCategorias', &#36;tsV-&gt;getCategorias());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVFiltro', &#36;filtro);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="font-weight: bold;" class="mycode_b">{/if}</span> final añade:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'videos'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='modules/m.admin_videos.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_rangos.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dt&gt;&lt;label for="goaf"&gt;Anti-flood&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Tiempo que deben esperar entre acci&amp;oacute;n.&lt;/span&gt;&lt;/dt&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;input type="text" id="goaf" name="global-antiflood" value="{&#36;tsRango.permisos.goaf}" style="width:30%"/&gt;&lt;/dd&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&lt;dt&gt;&lt;label for="govid"&gt;Publicar Vídeos&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Podrán publicar vídeos en el sitio.&lt;/span&gt;&lt;/dt&gt;<br />
&lt;dd&gt;&lt;input type="checkbox" id="govid" name="global-publicarvideos" {if &#36;tsRango.permisos.govid == 'on'}checked{/if} /&gt;&lt;/dd&gt;<br />
&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — En c.admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<br />
<span style="font-size: large;" class="mycode_size">En <span style="font-weight: bold;" class="mycode_b">saveRango()</span> y <span style="font-weight: bold;" class="mycode_b">newRango()</span> busca la línea:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday']);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Reemplazar por:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'govid' =&gt; &#36;_POST['global-publicarvideos'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 8 — En head_menu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;tsConfig.c_fotos_private == '1' &amp;&amp; !&#36;tsUser-&gt;is_member}{else}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="tabbed {if &#36;tsPage == 'fotos'}here{/if}" id="tabbedfotos"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Ir a Fotos" onclick="menu('fotos', this.href); return false;" href="{&#36;tsConfig.url}/fotos/"&gt;Fotos &lt;i class="fa-solid fa-caret-down"&gt;&lt;/i&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{/if}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'videos'}here{/if}" id="tabbedvideos"&gt;&lt;a title="Ir a Vídeos" href="{&#36;tsConfig.url}/videos/"&gt;Vídeos &lt;i class="fa-solid fa-film"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — Activar el permiso en los rangos</span><br />
<br />
En <span style="font-weight: bold;" class="mycode_b">Admin → Rangos → Editar</span> cada rango y activa <span style="font-weight: bold;" class="mycode_b">Publicar Vídeos</span>.</span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 10 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">📋 URLs del módulo</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Portada de vídeos: <span style="font-weight: bold;" class="mycode_b">/videos/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ver vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/ver/ID/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Publicar vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/nuevo/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Vídeos de usuario: <span style="font-weight: bold;" class="mycode_b">/videos/usuario/NICK/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin: <span style="font-weight: bold;" class="mycode_b">/admin/videos</span></span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS v_videos, v_categorias, v_comentarios, v_denuncias;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios realizados.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenidoídeos+v1.0.rar/file" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par...0.rar/file</a><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Vídeos v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/gJTMPf4.png" loading="lazy"  alt="[Imagen: gJTMPf4.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ZclVYr0.png" loading="lazy"  alt="[Imagen: ZclVYr0.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/90QpwV8.gif" loading="lazy"  alt="[Imagen: 90QpwV8.gif]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/myHy84a.png" loading="lazy"  alt="[Imagen: myHy84a.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ooClT4Q.png" loading="lazy"  alt="[Imagen: ooClT4Q.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/nDTNOSA.png" loading="lazy"  alt="[Imagen: nDTNOSA.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/saRfQjS.png" loading="lazy"  alt="[Imagen: saRfQjS.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/mK8CawO.png" loading="lazy"  alt="[Imagen: mK8CawO.png]" class="mycode_img img-responsive" /></div>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sistema completo de vídeos hecho desde cero para Risus Nova 2.0. Soporta YouTube y Vimeo, con comentarios, reportes, panel admin y control de permisos por rango.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🎬 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Soporte para <span style="font-weight: bold;" class="mycode_b">YouTube</span> y <span style="font-weight: bold;" class="mycode_b">Vimeo</span> — pegar la URL y se genera el reproductor automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Grid de tarjetas con miniatura de YouTube sin bandas negras</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Filtro por categoría y orden (nuevos / más vistos)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Comentarios en cada vídeo</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sistema de reportes — 3 reportes ocultan el vídeo automáticamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin con gestión de vídeos y categorías</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Control de permisos por rango desde <span style="font-weight: bold;" class="mycode_b">Admin → Rangos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">7 categorías por defecto (configurables desde el admin)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Instalador automático — crea todas las tablas</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Diseño responsive</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">El instalador crea automáticamente:</span></span><ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_videos</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_categorias</span> con 7 categorías por defecto</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_comentarios</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Tabla <span style="font-weight: bold;" class="mycode_b">v_denuncias</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Permiso <span style="font-weight: bold;" class="mycode_b">govid</span> añadido a todos los rangos</span><br />
</li>
</ul>
<br />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/php/videos.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/<br />
inc/php/ajax/ajax.videos.php&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/ajax/<br />
t.videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/<br />
m.video_card.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_ver.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.video_nuevo.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/<br />
m.admin_videos.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/<br />
videos.css&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/css/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En .htaccess</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba de <span style="font-weight: bold;" class="mycode_b"># FOTOS</span> agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code># VIDEOS<br />
RewriteRule ^videos/&#36; inc/php/videos.php?action= [QSA,L]<br />
RewriteRule ^videos/ver/([0-9]+)/&#36; inc/php/videos.php?action=ver&amp;vid=&#36;1 [QSA,L]<br />
RewriteRule ^videos/nuevo/&#36; inc/php/videos.php?action=nuevo [QSA,L]<br />
RewriteRule ^videos/usuario/([^/]+)/&#36; inc/php/videos.php?action=usuario&amp;nick=&#36;1 [QSA,L]<br />
RewriteRule ^admin/videos&#36; inc/php/admin.php?action=videos [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
Agregar arriba:<br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'videos'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.videos.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV = new tsVideos();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['addcat']) &amp;&amp; !empty(&#36;_POST['vcat_name'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsV-&gt;adminSaveCategoria();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsCore-&gt;redirectTo(&#36;tsCore-&gt;settings['url'].'/admin/videos');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;filtro = (int)(&#36;_GET['status'] ?? -1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAdminVideos', &#36;tsV-&gt;adminGetVideos());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVCategorias', &#36;tsV-&gt;getCategorias());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsVFiltro', &#36;filtro);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="font-weight: bold;" class="mycode_b">{/if}</span> final añade:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'videos'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='modules/m.admin_videos.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_rangos.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dt&gt;&lt;label for="goaf"&gt;Anti-flood&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Tiempo que deben esperar entre acci&amp;oacute;n.&lt;/span&gt;&lt;/dt&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dd&gt;&lt;input type="text" id="goaf" name="global-antiflood" value="{&#36;tsRango.permisos.goaf}" style="width:30%"/&gt;&lt;/dd&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;dl&gt;<br />
&lt;dt&gt;&lt;label for="govid"&gt;Publicar Vídeos&lt;/label&gt;&lt;br /&gt;&lt;span&gt;Podrán publicar vídeos en el sitio.&lt;/span&gt;&lt;/dt&gt;<br />
&lt;dd&gt;&lt;input type="checkbox" id="govid" name="global-publicarvideos" {if &#36;tsRango.permisos.govid == 'on'}checked{/if} /&gt;&lt;/dd&gt;<br />
&lt;/dl&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — En c.admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<br />
<span style="font-size: large;" class="mycode_size">En <span style="font-weight: bold;" class="mycode_b">saveRango()</span> y <span style="font-weight: bold;" class="mycode_b">newRango()</span> busca la línea:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday']);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Reemplazar por:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'gopfd' =&gt; &#36;_POST['global-pointsforday'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'govid' =&gt; &#36;_POST['global-publicarvideos'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 8 — En head_menu.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{if &#36;tsConfig.c_fotos_private == '1' &amp;&amp; !&#36;tsUser-&gt;is_member}{else}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li class="tabbed {if &#36;tsPage == 'fotos'}here{/if}" id="tabbedfotos"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a title="Ir a Fotos" onclick="menu('fotos', this.href); return false;" href="{&#36;tsConfig.url}/fotos/"&gt;Fotos &lt;i class="fa-solid fa-caret-down"&gt;&lt;/i&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{/if}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li class="tabbed {if &#36;tsPage == 'videos'}here{/if}" id="tabbedvideos"&gt;&lt;a title="Ir a Vídeos" href="{&#36;tsConfig.url}/videos/"&gt;Vídeos &lt;i class="fa-solid fa-film"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 9 — Activar el permiso en los rangos</span><br />
<br />
En <span style="font-weight: bold;" class="mycode_b">Admin → Rangos → Editar</span> cada rango y activa <span style="font-weight: bold;" class="mycode_b">Publicar Vídeos</span>.</span><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 10 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">📋 URLs del módulo</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Portada de vídeos: <span style="font-weight: bold;" class="mycode_b">/videos/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ver vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/ver/ID/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Publicar vídeo: <span style="font-weight: bold;" class="mycode_b">/videos/nuevo/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Vídeos de usuario: <span style="font-weight: bold;" class="mycode_b">/videos/usuario/NICK/</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin: <span style="font-weight: bold;" class="mycode_b">/admin/videos</span></span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b"><span style="color: #e74c3c;" class="mycode_color">🗑️ Desinstalar</span></span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>DROP TABLE IF EXISTS v_videos, v_categorias, v_comentarios, v_denuncias;</code></div></div><br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios realizados.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenidoídeos+v1.0.rar/file" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par...0.rar/file</a><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Newsletter v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Newsletter-v1-0</link>
			<pubDate>Fri, 29 May 2026 19:39:06 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Newsletter-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Newsletter v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/8NW8FxB.png" loading="lazy"  alt="[Imagen: 8NW8FxB.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/RhfYaCA.png" loading="lazy"  alt="[Imagen: RhfYaCA.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sistema de newsletter con consentimiento explícito (RGPD). Los usuarios eligen si quieren recibir comunicaciones al registrarse. El admin puede enviar emails personalizados a todos los suscritos o por rangos específicos.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📧 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Casilla opcional en el registro — consentimiento explícito</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin con estadísticas: suscritos / no suscritos / total</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Enviar por rango o a todos los suscritos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Personalización con <span style="font-weight: bold;" class="mycode_b">[usuario]</span> para el nombre del destinatario</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Botón desactivado si no hay suscritos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Email con enlace para cancelar la suscripción</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Cumple con el RGPD</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: x-large;" class="mycode_size">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>p.registro.form.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/php_files/<br />
m.admin_newsletter.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/admin_mods/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En c.registro.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;tsData['user_id'] = db_exec('insert_id');</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Newsletter: guardar consentimiento ──<br />
&#36;newsletter = !empty(&#36;_POST['newsletter']) ? 1 : 0;<br />
db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;"UPDATE u_miembros SET user_newsletter = '&#36;newsletter'<br />
&nbsp;&nbsp;&nbsp;&nbsp; WHERE user_id = '{&#36;tsData['user_id']}'"<br />
);<br />
// ────────────────────────────────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span><br />
<br />
Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'newsletter'){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Estadísticas<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats = [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'suscritos'&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'no_suscritos' =&gt; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'total'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;r = db_exec('fetch_row', db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(user_newsletter = 1) AS s,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(user_newsletter = 0) AS n,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*) AS t<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM u_miembros WHERE user_activo = '1' AND user_baneado = '0'"<br />
&nbsp;&nbsp;&nbsp;&nbsp;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;r) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats['suscritos']&nbsp;&nbsp;&nbsp;&nbsp;= (int)&#36;r[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats['no_suscritos'] = (int)&#36;r[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats['total']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= (int)&#36;r[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterStats', &#36;stats);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Rangos con conteo de suscritos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT r.rango_id, r.r_name, r.r_color,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(u.user_id) AS suscritos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM u_rangos AS r<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LEFT JOIN u_miembros AS u<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON u.user_rango = r.rango_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND u.user_newsletter = '1'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND u.user_activo = '1'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND u.user_baneado = '0'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY r.rango_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY r.r_cant ASC"<br />
&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterRangos', &#36;rangos);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Enviar<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['save']) &amp;&amp; !empty(&#36;_POST['nl_subject']) &amp;&amp; !empty(&#36;_POST['nl_body'])) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;asunto&nbsp;&nbsp;&nbsp;&nbsp; = &#36;tsCore-&gt;setSecure(&#36;_POST['nl_subject']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;cuerpo&nbsp;&nbsp;&nbsp;&nbsp; = &#36;_POST['nl_body'];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos_sel = &#36;_POST['rangos'] ?? [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;todos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= empty(&#36;rangos_sel);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;todos) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_newsletter = '1' AND user_activo = '1' AND user_baneado = '0'";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;ids&nbsp;&nbsp; = implode(',', array_map('intval', &#36;rangos_sel));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_newsletter = '1' AND user_activo = '1' AND user_baneado = '0' AND user_rango IN (&#36;ids)";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;usuarios = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT user_id, user_name, user_email FROM u_miembros WHERE &#36;where"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty(&#36;usuarios)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterError', 'No hay usuarios suscritos en los rangos seleccionados.');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.emails.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (&#36;usuarios as &#36;u) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;msg&nbsp;&nbsp;= str_replace('[usuario]', &#36;u['user_name'], &#36;cuerpo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html = '&lt;div style="font-family:Arial,sans-serif;max-width:600px;margin:0 auto;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;div style="background:#3498db;padding:16px 24px;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;h1 style="color:#fff;margin:0;font-size:22px;"&gt;' . &#36;tsCore-&gt;settings['titulo'] . '&lt;/h1&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;/div&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;div style="padding:24px;background:#fff;border:1px solid #eee;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;p style="font-size:15px;color:#333;line-height:1.7;"&gt;' . nl2br(htmlspecialchars(&#36;msg)) . '&lt;/p&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;/div&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;div style="padding:12px 24px;background:#f8f9fa;font-size:11px;color:#999;text-align:center;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= 'Para cancelar la suscripción accede a tu &lt;a href="' . &#36;tsCore-&gt;settings['url'] . '/cuenta/"&gt;cuenta&lt;/a&gt;.';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;/div&gt;&lt;/div&gt;';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail = new tsEmail('newsletter', 'newsletter');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailTo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#36;u['user_email'];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailSubject = &#36;asunto;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailBody&nbsp;&nbsp;&nbsp;&nbsp;= &#36;html;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailHeaders = &#36;tsEmail-&gt;setEmailHeaders();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;sendEmail(&#36;tsCore-&gt;settings['email'], &#36;u['user_email'], &#36;asunto, &#36;html);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterEnviado', &#36;total);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Añadir en t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">{/if}</span></span> final añade:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'newsletter'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='admin_mods/m.admin_newsletter.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_sidemenu.tpl agregan esto donde quieran:</span></span><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li&gt;&lt;a href="{&#36;tsConfig.url}/admin/newsletter"&gt;&lt;i class="fa-solid fa-envelope-open-text"&gt;&lt;/i&gt; Newsletter&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Paso 7 — Borrar la caché</span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta [b]/cache/</span> del sitio.</span>[/b]<br />
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔒 RGPD</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">El usuario da consentimiento explícito al registrarse</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Puede cancelar la suscripción desde su cuenta</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Solo se envía a usuarios que aceptaron recibirlo</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Las contraseñas nunca se incluyen en ningún email</span></span><br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>ALTER TABLE u_miembros DROP COLUMN user_newsletter;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los hooks.</span></span><br />
 <br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Descarga</span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">Mediafire</span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">Google Drive</span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span>[/b]</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Newsletter v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/8NW8FxB.png" loading="lazy"  alt="[Imagen: 8NW8FxB.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/RhfYaCA.png" loading="lazy"  alt="[Imagen: RhfYaCA.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Sistema de newsletter con consentimiento explícito (RGPD). Los usuarios eligen si quieren recibir comunicaciones al registrarse. El admin puede enviar emails personalizados a todos los suscritos o por rangos específicos.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📧 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Casilla opcional en el registro — consentimiento explícito</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Panel admin con estadísticas: suscritos / no suscritos / total</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Enviar por rango o a todos los suscritos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Personalización con <span style="font-weight: bold;" class="mycode_b">[usuario]</span> para el nombre del destinatario</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Botón desactivado si no hay suscritos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Email con enlace para cancelar la suscripción</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Cumple con el RGPD</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Ejecutar el instalador</span><br />
<br />
Sube la carpeta <span style="font-weight: bold;" class="mycode_b">install/</span> a la raíz y accede a:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Registrate o inicia tu sesión para ver este contenido</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: x-large;" class="mycode_size">⚠️ Elimina la carpeta install/ cuando termine.</span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>p.registro.form.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/php_files/<br />
m.admin_newsletter.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/admin_mods/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En c.registro.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;tsData['user_id'] = db_exec('insert_id');</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Newsletter: guardar consentimiento ──<br />
&#36;newsletter = !empty(&#36;_POST['newsletter']) ? 1 : 0;<br />
db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;"UPDATE u_miembros SET user_newsletter = '&#36;newsletter'<br />
&nbsp;&nbsp;&nbsp;&nbsp; WHERE user_id = '{&#36;tsData['user_id']}'"<br />
);<br />
// ────────────────────────────────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En admin.php</span><br />
<br />
Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Arriba agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'newsletter'){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Estadísticas<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats = [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'suscritos'&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'no_suscritos' =&gt; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'total'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;r = db_exec('fetch_row', db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(user_newsletter = 1) AS s,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUM(user_newsletter = 0) AS n,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(*) AS t<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM u_miembros WHERE user_activo = '1' AND user_baneado = '0'"<br />
&nbsp;&nbsp;&nbsp;&nbsp;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;r) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats['suscritos']&nbsp;&nbsp;&nbsp;&nbsp;= (int)&#36;r[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats['no_suscritos'] = (int)&#36;r[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;stats['total']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= (int)&#36;r[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterStats', &#36;stats);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Rangos con conteo de suscritos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT r.rango_id, r.r_name, r.r_color,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COUNT(u.user_id) AS suscritos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM u_rangos AS r<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LEFT JOIN u_miembros AS u<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ON u.user_rango = r.rango_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND u.user_newsletter = '1'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND u.user_activo = '1'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND u.user_baneado = '0'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY r.rango_id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY r.r_cant ASC"<br />
&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterRangos', &#36;rangos);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Enviar<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['save']) &amp;&amp; !empty(&#36;_POST['nl_subject']) &amp;&amp; !empty(&#36;_POST['nl_body'])) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;asunto&nbsp;&nbsp;&nbsp;&nbsp; = &#36;tsCore-&gt;setSecure(&#36;_POST['nl_subject']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;cuerpo&nbsp;&nbsp;&nbsp;&nbsp; = &#36;_POST['nl_body'];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos_sel = &#36;_POST['rangos'] ?? [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;todos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= empty(&#36;rangos_sel);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;todos) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_newsletter = '1' AND user_activo = '1' AND user_baneado = '0'";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;ids&nbsp;&nbsp; = implode(',', array_map('intval', &#36;rangos_sel));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_newsletter = '1' AND user_activo = '1' AND user_baneado = '0' AND user_rango IN (&#36;ids)";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;usuarios = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT user_id, user_name, user_email FROM u_miembros WHERE &#36;where"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (empty(&#36;usuarios)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterError', 'No hay usuarios suscritos en los rangos seleccionados.');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.emails.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (&#36;usuarios as &#36;u) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;msg&nbsp;&nbsp;= str_replace('[usuario]', &#36;u['user_name'], &#36;cuerpo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html = '&lt;div style="font-family:Arial,sans-serif;max-width:600px;margin:0 auto;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;div style="background:#3498db;padding:16px 24px;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;h1 style="color:#fff;margin:0;font-size:22px;"&gt;' . &#36;tsCore-&gt;settings['titulo'] . '&lt;/h1&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;/div&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;div style="padding:24px;background:#fff;border:1px solid #eee;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;p style="font-size:15px;color:#333;line-height:1.7;"&gt;' . nl2br(htmlspecialchars(&#36;msg)) . '&lt;/p&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;/div&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;div style="padding:12px 24px;background:#f8f9fa;font-size:11px;color:#999;text-align:center;"&gt;';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= 'Para cancelar la suscripción accede a tu &lt;a href="' . &#36;tsCore-&gt;settings['url'] . '/cuenta/"&gt;cuenta&lt;/a&gt;.';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;html .= '&lt;/div&gt;&lt;/div&gt;';<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail = new tsEmail('newsletter', 'newsletter');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailTo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= &#36;u['user_email'];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailSubject = &#36;asunto;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailBody&nbsp;&nbsp;&nbsp;&nbsp;= &#36;html;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;emailHeaders = &#36;tsEmail-&gt;setEmailHeaders();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsEmail-&gt;sendEmail(&#36;tsCore-&gt;settings['email'], &#36;u['user_email'], &#36;asunto, &#36;html);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsNewsletterEnviado', &#36;total);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Añadir en t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">{/if}</span></span> final añade:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'newsletter'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='admin_mods/m.admin_newsletter.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_sidemenu.tpl agregan esto donde quieran:</span></span><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li&gt;&lt;a href="{&#36;tsConfig.url}/admin/newsletter"&gt;&lt;i class="fa-solid fa-envelope-open-text"&gt;&lt;/i&gt; Newsletter&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Paso 7 — Borrar la caché</span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta [b]/cache/</span> del sitio.</span>[/b]<br />
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔒 RGPD</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">El usuario da consentimiento explícito al registrarse</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Puede cancelar la suscripción desde su cuenta</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Solo se envía a usuarios que aceptaron recibirlo</span></span><br />
</li>
<li><span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Las contraseñas nunca se incluyen en ningún email</span></span><br />
</li>
</ul>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>ALTER TABLE u_miembros DROP COLUMN user_newsletter;</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los hooks.</span></span><br />
 <br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Descarga</span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">Mediafire</span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">Google Drive</span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span>[/b]</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Avisos Masivos v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Avisos-Masivos-v1-0</link>
			<pubDate>Fri, 29 May 2026 18:46:45 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Avisos-Masivos-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Avisos Masivos v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/DivSqAn.png" loading="lazy"  alt="[Imagen: DivSqAn.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Permite al admin enviar un aviso a todos los usuarios o a rangos específicos desde el panel. El aviso aparece en las notificaciones de cada usuario.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📢 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Enviar a todos los usuarios o a rangos específicos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Selección múltiple de rangos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Asunto y mensaje personalizables (máx 500 caracteres)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Los admins y moderadores no reciben el aviso</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Confirmación antes de enviar</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra cuántos usuarios recibieron el aviso</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir el archivo</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>themes/default/templates/admin_mods/m.admin_avisos_masivos.tpl<br />
&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/admin_mods/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'avisosmasivos'){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT rango_id, r_name, r_color FROM u_rangos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE r_type = '1' ORDER BY r_cant ASC"<br />
&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsRangosDisponibles', &#36;rangos);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['save']) &amp;&amp; !empty(&#36;_POST['av_subject']) &amp;&amp; !empty(&#36;_POST['av_body'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;asunto&nbsp;&nbsp;&nbsp;&nbsp; = &#36;tsCore-&gt;setSecure(&#36;_POST['av_subject']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;cuerpo&nbsp;&nbsp;&nbsp;&nbsp; = &#36;tsCore-&gt;setSecure(&#36;_POST['av_body']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos_sel = &#36;_POST['rangos'] ?? [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;todos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= empty(&#36;rangos_sel);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;todos) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_activo = '1' AND user_baneado = '0'";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;ids&nbsp;&nbsp; = implode(',', array_map('intval', &#36;rangos_sel));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_activo = '1' AND user_baneado = '0' AND user_rango IN (&#36;ids)";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;usuarios = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT user_id FROM u_miembros WHERE &#36;where"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;fecha = time();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (&#36;usuarios as &#36;u) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"INSERT INTO u_avisos (user_id, av_subject, av_body, av_date, av_type)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES ('{&#36;u['user_id']}', '&#36;asunto', '&#36;cuerpo', '&#36;fecha', '4')"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAvisoEnviado', &#36;total);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Añadir en t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">{/if}</span></span> final agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'avisosmasivos'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='admin_mods/m.admin_avisos_masivos.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En m.admin_sidemenu.tpl ponen esto donde quieran:</span></span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;i class="fa-solid fa-bullhorn"&gt;&lt;/i&gt; Avisos Masivos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="{&#36;tsConfig.url}/admin/mensajesadmin"&gt;&lt;i class="fa-solid fa-envelope"&gt;&lt;/i&gt; Mensajes Privados&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina la plantilla y quita los cambios en <span style="font-weight: bold;" class="mycode_b">admin.php</span> y <span style="font-weight: bold;" class="mycode_b">t.admin.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Avisos Masivos v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/DivSqAn.png" loading="lazy"  alt="[Imagen: DivSqAn.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Permite al admin enviar un aviso a todos los usuarios o a rangos específicos desde el panel. El aviso aparece en las notificaciones de cada usuario.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📢 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Enviar a todos los usuarios o a rangos específicos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Selección múltiple de rangos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Asunto y mensaje personalizables (máx 500 caracteres)</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Los admins y moderadores no reciben el aviso</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Confirmación antes de enviar</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra cuántos usuarios recibieron el aviso</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir el archivo</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>themes/default/templates/admin_mods/m.admin_avisos_masivos.tpl<br />
&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/admin_mods/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'feed'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'avisosmasivos'){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT rango_id, r_name, r_color FROM u_rangos<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE r_type = '1' ORDER BY r_cant ASC"<br />
&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsRangosDisponibles', &#36;rangos);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!empty(&#36;_GET['save']) &amp;&amp; !empty(&#36;_POST['av_subject']) &amp;&amp; !empty(&#36;_POST['av_body'])) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;asunto&nbsp;&nbsp;&nbsp;&nbsp; = &#36;tsCore-&gt;setSecure(&#36;_POST['av_subject']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;cuerpo&nbsp;&nbsp;&nbsp;&nbsp; = &#36;tsCore-&gt;setSecure(&#36;_POST['av_body']);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;rangos_sel = &#36;_POST['rangos'] ?? [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;todos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= empty(&#36;rangos_sel);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;todos) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_activo = '1' AND user_baneado = '0'";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;ids&nbsp;&nbsp; = implode(',', array_map('intval', &#36;rangos_sel));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;where = "user_activo = '1' AND user_baneado = '0' AND user_rango IN (&#36;ids)";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;usuarios = result_array(db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SELECT user_id FROM u_miembros WHERE &#36;where"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)) ?: [];<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;fecha = time();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (&#36;usuarios as &#36;u) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db_exec([__FILE__, __LINE__], 'query',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"INSERT INTO u_avisos (user_id, av_subject, av_body, av_date, av_type)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES ('{&#36;u['user_id']}', '&#36;asunto', '&#36;cuerpo', '&#36;fecha', '4')"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;total++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsAvisoEnviado', &#36;total);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Añadir en t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">{/if}</span></span> final agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'avisosmasivos'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='admin_mods/m.admin_avisos_masivos.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En m.admin_sidemenu.tpl ponen esto donde quieran:</span></span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;i class="fa-solid fa-bullhorn"&gt;&lt;/i&gt; Avisos Masivos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="{&#36;tsConfig.url}/admin/mensajesadmin"&gt;&lt;i class="fa-solid fa-envelope"&gt;&lt;/i&gt; Mensajes Privados&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina la plantilla y quita los cambios en <span style="font-weight: bold;" class="mycode_b">admin.php</span> y <span style="font-weight: bold;" class="mycode_b">t.admin.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Panel de Mensajes Privados v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Panel-de-Mensajes-Privados-v1-0</link>
			<pubDate>Fri, 29 May 2026 18:21:16 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Panel-de-Mensajes-Privados-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Panel de Mensajes Privados v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/9us6FJS.png" loading="lazy"  alt="[Imagen: 9us6FJS.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/7UAgPvr.png" loading="lazy"  alt="[Imagen: 7UAgPvr.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/hTwXwTw.png" loading="lazy"  alt="[Imagen: hTwXwTw.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Panel para gestionar los mensajes privados entre usuarios desde el admin. Ver conversaciones completas, eliminar mensajes individuales o respuestas, y enviar alertas a usuarios.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">✉️ Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Lista paginada de todos los mensajes privados</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ver remitente, destinatario, asunto y fecha</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Leer conversación completa con avatares</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Eliminar mensajes completos o respuestas individuales</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Enviar alerta al usuario directamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra IP de cada respuesta</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.mensajes_admin.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/ajax.mensajes_admin.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/php/ajax/<br />
themes/default/templates/admin_mods/m.admin_mensajes.tpl →&nbsp;&nbsp;themes/default/templates/admin_mods/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En .htaccess</span><br />
<br />
Buscar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>RewriteRule ^admin/news/nueva inc/php/admin.php?action=news&amp;act=nuevo [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>RewriteRule ^admin/mensajesadmin/leer/([0-9]+)&#36; inc/php/admin.php?action=mensajesadmin&amp;act=leer&amp;mpid=&#36;1 [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'temas'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'mensajesadmin'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.mensajes_admin.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsMAdmin = new tsMensajesAdmin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (empty(&#36;act)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsMensajesLista', &#36;tsMAdmin-&gt;getLista());<br />
&nbsp;&nbsp;&nbsp;&nbsp;} elseif (&#36;act == 'leer') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsMensajesCabecera', &#36;tsMAdmin-&gt;getCabecera());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsMensajesRespuestas', &#36;tsMAdmin-&gt;getRespuestas());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En ajax.admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'admin-badwords-delete' =&gt; array('n' =&gt; 4, 'p' =&gt; ''),</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'mp-admin-borrar' =&gt; array('n' =&gt; 4, 'p' =&gt; ''),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mp-admin-borrar-respuesta' =&gt; array('n' =&gt; 4, 'p' =&gt; ''),</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar al final:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;die('0: Este archivo no existe.');<br />
break;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>case 'mp-admin-borrar':<br />
case 'mp-admin-borrar-respuesta':<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.mensajes_admin.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsMAdmin = new tsMensajesAdmin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;action === 'mp-admin-borrar') echo &#36;tsMAdmin-&gt;eliminarMensaje();<br />
&nbsp;&nbsp;&nbsp;&nbsp;else echo &#36;tsMAdmin-&gt;eliminarRespuesta();<br />
break;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">{/if}</span></span> final agregar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'mensajesadmin'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='admin_mods/m.admin_mensajes.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_sidemenu.tpl agregar esto donde quieran:</span></span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li&gt;&lt;a href="{&#36;tsConfig.url}/admin/mensajesadmin"&gt;&lt;i class="fa-solid fa-envelope"&gt;&lt;/i&gt; Mensajes Privados&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">admin.php</span>, <span style="font-weight: bold;" class="mycode_b">ajax.admin.php</span> y <span style="font-weight: bold;" class="mycode_b">t.admin.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Panel de Mensajes Privados v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Capturas</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/9us6FJS.png" loading="lazy"  alt="[Imagen: 9us6FJS.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/7UAgPvr.png" loading="lazy"  alt="[Imagen: 7UAgPvr.png]" class="mycode_img img-responsive" /></div>
 <br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/hTwXwTw.png" loading="lazy"  alt="[Imagen: hTwXwTw.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Panel para gestionar los mensajes privados entre usuarios desde el admin. Ver conversaciones completas, eliminar mensajes individuales o respuestas, y enviar alertas a usuarios.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">✉️ Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Lista paginada de todos los mensajes privados</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Ver remitente, destinatario, asunto y fecha</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Leer conversación completa con avatares</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Eliminar mensajes completos o respuestas individuales</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Enviar alerta al usuario directamente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra IP de cada respuesta</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos nueva</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/class/c.mensajes_admin.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
inc/ajax.mensajes_admin.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→&nbsp;&nbsp;inc/php/ajax/<br />
themes/default/templates/admin_mods/m.admin_mensajes.tpl →&nbsp;&nbsp;themes/default/templates/admin_mods/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En .htaccess</span><br />
<br />
Buscar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>RewriteRule ^admin/news/nueva inc/php/admin.php?action=news&amp;act=nuevo [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>RewriteRule ^admin/mensajesadmin/leer/([0-9]+)&#36; inc/php/admin.php?action=mensajesadmin&amp;act=leer&amp;mpid=&#36;1 [QSA,L]</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">En admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'temas'){</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>} elseif(&#36;action == 'mensajesadmin'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.mensajes_admin.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsMAdmin = new tsMensajesAdmin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (empty(&#36;act)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsMensajesLista', &#36;tsMAdmin-&gt;getLista());<br />
&nbsp;&nbsp;&nbsp;&nbsp;} elseif (&#36;act == 'leer') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsMensajesCabecera', &#36;tsMAdmin-&gt;getCabecera());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#36;smarty-&gt;assign('tsMensajesRespuestas', &#36;tsMAdmin-&gt;getRespuestas());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — En ajax.admin.php</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'admin-badwords-delete' =&gt; array('n' =&gt; 4, 'p' =&gt; ''),</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>'mp-admin-borrar' =&gt; array('n' =&gt; 4, 'p' =&gt; ''),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mp-admin-borrar-respuesta' =&gt; array('n' =&gt; 4, 'p' =&gt; ''),</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Buscar al final:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;die('0: Este archivo no existe.');<br />
break;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Agregar arriba:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>case 'mp-admin-borrar':<br />
case 'mp-admin-borrar-respuesta':<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once TS_CLASS . 'c.mensajes_admin.php';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#36;tsMAdmin = new tsMensajesAdmin();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (&#36;action === 'mp-admin-borrar') echo &#36;tsMAdmin-&gt;eliminarMensaje();<br />
&nbsp;&nbsp;&nbsp;&nbsp;else echo &#36;tsMAdmin-&gt;eliminarRespuesta();<br />
break;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 5 — En t.admin.tpl</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Antes del <span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">{/if}</span></span> final agregar:</span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{elseif &#36;tsAction == 'mensajesadmin'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;{include file='admin_mods/m.admin_mensajes.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 6 — En m.admin_sidemenu.tpl agregar esto donde quieran:</span></span><br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&lt;li&gt;&lt;a href="{&#36;tsConfig.url}/admin/mensajesadmin"&gt;&lt;i class="fa-solid fa-envelope"&gt;&lt;/i&gt; Mensajes Privados&lt;/a&gt;&lt;/li&gt;</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 7 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los cambios en <span style="font-weight: bold;" class="mycode_b">admin.php</span>, <span style="font-weight: bold;" class="mycode_b">ajax.admin.php</span> y <span style="font-weight: bold;" class="mycode_b">t.admin.tpl</span>.</span><br />
<hr class="mycode_hr" />
 <br />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Destacados en Tiempo Real v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Destacados-en-Tiempo-Real-v1-0</link>
			<pubDate>Fri, 29 May 2026 15:09:05 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Destacados-en-Tiempo-Real-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Destacados en Tiempo Real v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ZVNiyRE.png" loading="lazy"  alt="[Imagen: ZVNiyRE.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Widget para la portada con los posts más votados en las últimas horas. Filtros de <span style="font-weight: bold;" class="mycode_b">15 min, 1h, 3h y 6h</span>. El mismo estilo que el TOP Posts existente. Inspirado en el sistema de "Destacados" de Taringa.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔥 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">4 filtros de tiempo: 15 min, 1h, 3h y 6h</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Carga con AJAX — sin recargar la página</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Mismo estilo que el TOP Posts existente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Solo 2 archivos a subir</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/php/ajax/ajax.destacados.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/ajax/<br />
themes/default/templates/modules/m.destacados.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Añadir el widget en la portada</span><br />
<br />
En t.home.tpl pones esto donde quieras:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.destacados.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Borrar la caché</span><br />
<br />
Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los 2 archivos y quita el include de la plantilla.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">Google Drive</span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Destacados en Tiempo Real v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/ZVNiyRE.png" loading="lazy"  alt="[Imagen: ZVNiyRE.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Widget para la portada con los posts más votados en las últimas horas. Filtros de <span style="font-weight: bold;" class="mycode_b">15 min, 1h, 3h y 6h</span>. El mismo estilo que el TOP Posts existente. Inspirado en el sistema de "Destacados" de Taringa.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🔥 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">4 filtros de tiempo: 15 min, 1h, 3h y 6h</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Carga con AJAX — sin recargar la página</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Mismo estilo que el TOP Posts existente</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Solo 2 archivos a subir</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="font-size: x-large;" class="mycode_size"><span style="color: #2980b9;" class="mycode_color"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/php/ajax/ajax.destacados.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/php/ajax/<br />
themes/default/templates/modules/m.destacados.tpl&nbsp;&nbsp;→&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — Añadir el widget en la portada</span><br />
<br />
En t.home.tpl pones esto donde quieras:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.destacados.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — Borrar la caché</span><br />
<br />
Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los 2 archivos y quita el include de la plantilla.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">Google Drive</span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Niveles de Actividad v1.0]]></title>
			<link>https://phpost.es/tema-COMPLEMENTOS-Niveles-de-Actividad-v1-0</link>
			<pubDate>Fri, 29 May 2026 13:03:53 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://phpost.es/member.php?action=profile&uid=1">Tronlar</a>]]></dc:creator>
			<guid isPermaLink="false">https://phpost.es/tema-COMPLEMENTOS-Niveles-de-Actividad-v1-0</guid>
			<description><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Niveles de Actividad v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/aeusDMX.png" loading="lazy"  alt="[Imagen: aeusDMX.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Muestra en el perfil del usuario su nivel de actividad con una barra de progreso hacia el siguiente rango. Usa los rangos ya configurados en el script — no crea nuevos.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📊 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Barra de progreso hacia el siguiente rango</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra puntos actuales y cuántos faltan</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Rangos especiales (Admin, Mod) — barra dorada sin progreso</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Usa los rangos existentes del script</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/nivel_helper.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
m.perfil_nivel.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En perfil.php</span><br />
<br />
Busca en <span style="font-weight: bold;" class="mycode_b">inc/php/perfil.php</span>:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;smarty-&gt;assign("tsGeneral",&#36;tsGeneral);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Niveles de actividad ──<br />
require_once TS_CLASS . 'nivel_helper.php';<br />
&#36;smarty-&gt;assign('tsNivel', tsGetNivel(&#36;tsInfo['stats']['user_puntos'], &#36;tsInfo['stats']['user_rango']));<br />
// ─────────────────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En m.perfil_sidebar.tpl</span><br />
<br />
Añade antes del widget de medallas:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.perfil_nivel.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los hooks. No hay tablas que borrar.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Niveles de Actividad v1.0</span></span></span><br />
<span style="font-size: large;" class="mycode_size">Nuevo módulo para Risus Nova 2.0 — PHPost</span></div>
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Captura</span></span></span><br />
<div style="text-align: center;" class="mycode_align"><img src="https://i.imgur.com/aeusDMX.png" loading="lazy"  alt="[Imagen: aeusDMX.png]" class="mycode_img img-responsive" /></div>
<hr class="mycode_hr" />
<br />
<span style="font-size: large;" class="mycode_size">Muestra en el perfil del usuario su nivel de actividad con una barra de progreso hacia el siguiente rango. Usa los rangos ya configurados en el script — no crea nuevos.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">📊 Características</span></span></span><br />
 <ul class="mycode_list"><li><span style="font-size: large;" class="mycode_size">Barra de progreso hacia el siguiente rango</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Muestra puntos actuales y cuántos faltan</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Rangos especiales (Admin, Mod) — barra dorada sin progreso</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Usa los rangos existentes del script</span><br />
</li>
<li><span style="font-size: large;" class="mycode_size">Sin instalador ni base de datos</span><br />
</li>
</ul>
 <br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🛠️ Instalación</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 1 — Subir los archivos</span></span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>inc/nivel_helper.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;inc/class/<br />
m.perfil_nivel.tpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; →&nbsp;&nbsp;themes/default/templates/modules/</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 2 — En perfil.php</span><br />
<br />
Busca en <span style="font-weight: bold;" class="mycode_b">inc/php/perfil.php</span>:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>&#36;smarty-&gt;assign("tsGeneral",&#36;tsGeneral);</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size">Debajo agregar:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>// ── Niveles de actividad ──<br />
require_once TS_CLASS . 'nivel_helper.php';<br />
&#36;smarty-&gt;assign('tsNivel', tsGetNivel(&#36;tsInfo['stats']['user_puntos'], &#36;tsInfo['stats']['user_rango']));<br />
// ─────────────────────────</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 3 — En m.perfil_sidebar.tpl</span><br />
<br />
Añade antes del widget de medallas:</span><br />
 <br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>{include file='modules/m.perfil_nivel.tpl'}</code></div></div><br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Paso 4 — Borrar la caché</span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Borra el contenido de la carpeta <span style="font-weight: bold;" class="mycode_b">/cache/</span> del sitio.</span><br />
<hr class="mycode_hr" />
<br />
<span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">🗑️ Desinstalar</span></span></span><br />
<br />
<span style="font-size: large;" class="mycode_size">Elimina los archivos y quita los hooks. No hay tablas que borrar.</span><br />
<hr class="mycode_hr" />
 <br />
<div style="text-align: center;" class="mycode_align"><span style="color: #2980b9;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Descarga</span></span></span><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Mediafire</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<span style="font-size: large;" class="mycode_size"><span style="font-weight: bold;" class="mycode_b">Google Drive</span></span><br />
<a href="http://Registrate%20o%20inicia%20tu%20sesión%20para%20ver%20este%20contenido" target="_blank" rel="noopener" class="mycode_url">http://Registrate o inicia tu sesión par... contenido</a><br />
<br />
<br />
<br />
<span style="font-size: large;" class="mycode_size">¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.</span><br />
<br />
<br />
<br />
</div>]]></content:encoded>
		</item>
	</channel>
</rss>