-
Tema Identi (Cat/Vip) 202...
Foro: Diseños Terminados
Último mensaje por: evilnix
Hace 7 horas
» Respuestas: 26
» Vistas: 5,861 -
Nueva etapa del proyecto:...
Foro: Noticias y Novedades
Último mensaje por: Videmax
04-27-2026, 03:41 AM
» Respuestas: 4
» Vistas: 242 -
V6 Original/Dark/Memes (A...
Foro: Diseños Terminados
Último mensaje por: Tronlar
04-24-2026, 07:15 AM
» Respuestas: 25
» Vistas: 5,732 -
Aquí yace un Taringuero
Foro: Presentaciones
Último mensaje por: Tronlar
04-23-2026, 06:24 AM
» Respuestas: 2
» Vistas: 162 -
Taringa V7 V3 (2023)
Foro: Diseños Terminados
Último mensaje por: Tronlar
04-23-2026, 06:18 AM
» Respuestas: 32
» Vistas: 5,266 -
Hola a todos
Foro: Presentaciones
Último mensaje por: Tronlar
04-23-2026, 06:05 AM
» Respuestas: 1
» Vistas: 103 -
presento TELFULL
Foro: Preséntanos tu web
Último mensaje por: Tronlar
04-19-2026, 04:01 PM
» Respuestas: 14
» Vistas: 1,222 -
Firma en fotos
Foro: Ayuda y Soporte
Último mensaje por: moyo
03-22-2025, 06:44 PM
» Respuestas: 0
» Vistas: 59 -
Noticia diferente por pág...
Foro: Ayuda y Soporte
Último mensaje por: moyo
03-05-2025, 04:13 AM
» Respuestas: 2
» Vistas: 144 -
MEGABlog V1.5 (Act 1.3)
Foro: Diseños Terminados
Último mensaje por: Tronlar
01-17-2025, 11:13 AM
» Respuestas: 8
» Vistas: 1,823
- Mensajes del foro:1,760
- Temas del foro:557
- Miembros:1,008
- Último miembro:go88baby
Tenía visitando varias veces el sitio pero estaba cerrado, me lo recomendaron mucho, gracias por aceptarme
Después de mucho tiempo modificando este proyecto, he llegado a un punto donde necesito tomar una decisión importante sobre su futuro. He estado añadiendo funcionalidades, parcheando errores y haciendo mejoras incrementales, pero ha llegado el momento de dar un paso atrás y reestructurar todo desde sus cimientos.
La situación actual
Con el tiempo, el proyecto ha acumulado:
- Código legacy que se arrastra desde versiones antiguas
- Estructura de base de datos que no es óptima para las necesidades actuales
- Arquitectura inconsistente con múltiples patrones mezclados
- Complejidad innecesaria que dificulta el mantenimiento
- Themes desactualizados que necesitan modernización
El plan de refactorización
A partir de ahora, voy a enfocarme en:1. Base de datos
- Rediseño completo del esquema
- Normalización y optimización de tablas
- Eliminación de campos obsoletos
- Mejora en las relaciones entre entidades
- Reestructuración de clases y módulos
- Implementación consistente de patrones de diseño
- Separación clara de responsabilidades
- Eliminación de dependencias circulares
- Limpieza de código duplicado
- Eliminación de funcionalidades no utilizadas
- Refactorización de lógica compleja
- Documentación mejorada (por verse, siempre me olvido)
- Aprovechamiento completo de características de PHP 8
- Actualización de librerías y dependencias
- Mejores prácticas de seguridad
- Performance optimizada
- Adaptación gradual de los themes existentes
- Código más limpio y mantenible
- Mejor estructura de componentes
- Estilos más consistentes
Consideraciones importantes
Compatibilidad
No habrá compatibilidad hacia atrás durante este proceso. Los cambios en la base de datos y estructura del código romperán con versiones anteriores. Esto es necesario para poder hacer las mejoras que el proyecto necesita.
Estabilidad
Durante este período de transición:
- Puede haber inestabilidad temporal
- Algunas funcionalidades pueden estar temporalmente deshabilitadas
- El proyecto puede volverse más pesado mientras migro componentes
Esta no es una tarea de días o semanas. Es un proceso que llevará tiempo hacer bien. Prefiero hacerlo correctamente que rápido.
El objetivo final
El objetivo de todo esto es tener un proyecto que sea:
✅ Más comprensible - Código claro que cualquiera pueda entender
✅ Más simple - Sin complejidad innecesaria ni código oscuro
✅ Más mantenible - Fácil de actualizar y extender
✅ Más robusto - Menos bugs, mejor manejo de errores
✅ Más moderno - Aprovechando las mejores prácticas actuales
✅ Mejor documentado - Para que otros puedan contribuir
Si quieres contribuir:
- Espera a que la nueva estructura esté lista
- Revisa la documentación nueva cuando esté disponible
- Reporta issues si encuentras algo en las versiones de desarrollo
- Ideas claramente no hace falta que contribuyas con código, reparaciones, etc... Puedes dar ideas nuevas.
Reflexión finalSé que romper compatibilidad nunca es una decisión fácil, pero a veces es necesario para poder avanzar. He aprendido mucho modificando este proyecto, y parte de ese aprendizaje es reconocer cuándo algo necesita ser rehecho correctamente en lugar de seguir parcheando.
Este es un compromiso con la calidad a largo plazo del proyecto. Puede que sea un camino difícil, pero al final tendremos algo mucho mejor.
Gracias por su comprensión y apoyo. 🙏
Última versión estable: http://Registrate o inicia tu sesión par... contenido (creo que podría ser este, es del 2022)
Última versión anterior estable: http://Registrate o inicia tu sesión par... contenido (este es del 2019 php 7)
Última versión desarrollo: http://Registrate o inicia tu sesión par... contenido (subido 15.04.26, no contiene las imágenes de categorías, tiene otras .svg)
Hola ¿cómo puedo mostrar la firma de usuario en la sección de fotos en particular en .m_fotos_ver_content ?
Si en el modulo de la noticia global está así:
{if $tsConfig.news}
{foreach from=$tsConfig.news key=i item=n}
{$n.not_body}
{/foreach}
{/i}
Y en administración tengo 5 noticias activas.
Pero quiero mostrar una noticia diferente en cada página por medio del id de la noticia, ¿Cómo lo hago?
Buenos días a todos.
Mi nombre es Cristian, mi nickname es una unificación de nombre y apellido.
Me uní recién a PHpost pero recuerdo que hace AÑOS tenía una cuenta donde escribía y enviaba páginas similares a Taringa (cuando todavía existía en NEW FULL USER) imaginensé ustedes.
Soy de Argentina y espero pronto estar compartiendo mis proyectos.
Sin más.
Cordial saludo a todos.
Hola chicoas, alguien tiene las comunidades responsive?
No me carga la imagen en el post, la de portada si, pero la de la portada, y en el movil no me carga la pagina el diseño.[img]Registrate o inicia tu sesión para ver este contenido[/img]
Revisando el archivo "error_logs" no muestra el fallo, tampoco ha sido modificado ningún archivo.
Versión de PHP: 7.4
Pedido: Identificación con RRSS
Autor: York0x
Bueno, en realidad es algo que había creado para ZCode, lo pude haber hecho con alguna librería php para facilitarlo, pero como solamente requeria algunos servicios, poner un monton de archivos para no usarlo, se me hacia una perdida de recursos innecesarios, por lo cual he decidido dejar: Google, Discord, Github y Facebook.
A este 'MOD' lo hice para ZCode, por lo cual algunas cosas deberán adaptarlos ustedes a su tema, como por ejemplo la configuración de las redes sociales.
Solo colocaré enlaces de youtube para obtener las claves de cada uno, ya que se convertiría en un tutorial demasiado extenso.
Google: http://Registrate o inicia tu sesión par... contenido (Min. 12:49)
Twitter: http://Registrate o inicia tu sesión par... contenido (Min. 26:03) [sin uso, por el momento]
Facebook: http://Registrate o inicia tu sesión par... contenido (Min. 32:07)
Discord: http://Registrate o inicia tu sesión par... contenido (Hasta el min 02:05)
Github: http://Registrate o inicia tu sesión par... contenido
En el servidor de discord accediendo a este mensaje tendrás las formas de obtener las claves en modo guía, solo los pasos sin imágenes (y también están fijados en el canal "#actualizaciones")
Lo que realmente necesitaremos usar es Client-ID, Client-Secret y en RedirectURL/Callback le colocarás la url que da la administración de tu sitio.
1 - Ejecutar las siguentes consultas
CREATE TABLE IF NOT EXISTS `miembros_social` (
`social_id` int(11) NOT NULL AUTO_INCREMENT,
`social_user_id` int(11) NOT NULL DEFAULT 0,
`social_name` varchar(20) NOT NULL DEFAULT '',
`social_nick` varchar(24) NOT NULL DEFAULT '',
`social_email` varchar(80) NOT NULL DEFAULT '',
PRIMARY KEY (`social_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `settings_social` (
`social_id` int(11) NOT NULL AUTO_INCREMENT,
`social_name` varchar(22) NOT NULL DEFAULT '',
`social_client_id` tinytext NULL,
`social_client_secret` tinytext NULL,
`social_redirect_uri` tinytext NULL,
PRIMARY KEY (`social_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2 - Agregar en .htaccess debajo de
RewriteRule ^agregar.php$ inc/php/agregar.php [QSA,L]
añadir esto
# CALLBACK PARA REDES SOCIALES
RewriteRule ^(github|discord|google|facebook|twitter)\.php$ inc/callback/$1.php [QSA,L]
3 - Agregar en header.php debajo de
$smarty->assign('tsConfig', $tsCore->settings);
esto
$smarty->assign('SocialMager', $tsCore->OAuth());
4 - Ir a inc/class/c.core.php y arriba de la última llave } agregan lo siguiente
public function getEndPoints(string $social = '', string $type = '') {
$getEndPoints = [
'github' => [
'authorize' => 'Registrate o inicia tu sesión para ver este contenido
'token' => "Registrate o inicia tu sesión para ver este contenido",
'revoke' => "",
'user' => "Registrate o inicia tu sesión para ver este contenido",
'scope' => "user"
],
'discord' => [
'authorize' => 'Registrate o inicia tu sesión para ver este contenido
'token' => "Registrate o inicia tu sesión para ver este contenido",
'revoke' => "Registrate o inicia tu sesión para ver este contenido",
'user' => "Registrate o inicia tu sesión para ver este contenido@me",
'scope' => "email identify"
],
'google' => [
'authorize' => 'Registrate o inicia tu sesión para ver este contenido
'token' => "Registrate o inicia tu sesión para ver este contenido",
'user' => "Registrate o inicia tu sesión para ver este contenido",
'revoke' => "",
'scope' => "Registrate o inicia tu sesión para ver este contenido Registrate o inicia tu sesión para ver este contenido"
],
'facebook' => [
'authorize' => "Registrate o inicia tu sesión para ver este contenido",
'token' => "Registrate o inicia tu sesión para ver este contenido",
'revoke' => "",
'user' => "Registrate o inicia tu sesión para ver este contenido",
'scope' => "email,public_profile"
]
];
return $getEndPoints[$social][$type];
}
/**
* Genera URLs de autorización OAuth para diferentes proveedores sociales.
*
* @return array Un array asociativo con el nombre del proveedor como clave y la URL de autorización como valor.
*/
public function OAuth(string $redirect = ''): array {
// Obtener la lista de proveedores OAuth
$OAuths = result_array(db_exec([__FILE__, __LINE__], 'query', 'SELECT social_name, social_client_id, social_client_secret, social_redirect_uri FROM settings_social'));
$routes = [];
foreach ($OAuths as $auth) {
// Preparar los parámetros para la solicitud OAuth
$parameters['client_id'] = $auth['social_client_id'];
$parameters['scope'] = $this->getEndPoints($auth['social_name'], 'scope');
$parameters['response_type'] = ($auth['social_name'] === 'github') ? '' : 'code';
$parameters['redirect_uri'] = $auth['social_redirect_uri'];
// Eliminar el parámetro response_type si es 'github'
if ($auth['social_name'] === 'github') {
unset($parameters['response_type']);
}
if(in_array($auth['social_name'], ['google', 'discord'])) {
$parameters['prompt'] = 'consent';
}
// Construir la URL de autorización
$queryString = http_build_query(array_filter($parameters));
$authorizeUrl = $this->getEndPoints($auth['social_name'], 'authorize');
$routes[$auth['social_name']] = "$authorizeUrl?$queryString";
}
return $routes;
}
5 - Ir a inc/class/c.cuenta.php y justo debajo de
class tsCuenta {
agregan
private function getSocialUser(int $user_id = 0) {
// Redes viculadas
$socials = result_array(db_exec([__FILE__, __LINE__], 'query', "SELECT social_name as name FROM miembros_social WHERE social_user_id = $user_id"));
$array_social = [
'discord' => false,
'facebook' => false,
'github' => false,
'google' => false
];
foreach($socials as $sn) {
$name = $sn['name'];
if (isset($array_social[$name])) {
$array_social[$name] = true;
}
}
return $array_social;
}
Luego dentro de la función
public function loadPerfil($user_id = 0){
buscar
$perfilInfo = $this->unData($perfilInfo);
y agregar debajo
$perfilInfo['socials'] = $this->getSocialUser($user_id);
6 - Luego en inc/class/c.user.php y arriba de la funcion
public function loginUser(...)
agregar lo siguiente
/*
* Desconectar la red social de nuestra cuenta
*/
public function unlinkAccount() {
global $tsCore;
# Buscamos para desactivar
$delete = $tsCore->setSecure($_POST['social']);
if($this->is_member) {
$data = db_exec('fetch_assoc', db_exec([__FILE__, __LINE__], 'query', "SELECT u.user_id, m.social_id, m.social_name FROM u_miembros AS u LEFT JOIN miembros_social AS m ON m.social_user_id = u.user_id WHERE u.user_id = {$this->uid} AND m.social_name = '$delete' LIMIT 1"));
$sid = (int)$data['social_id'];
// Actualizamos la tabla
return (db_exec([__FILE__, __LINE__], 'query', "DELETE FROM miembros_social WHERE social_id = $sid AND social_name = '$delete' AND social_user_id = {$this->uid}")) ? true : false;
}
}
/**
* Se repiten en 2 funciones diferentes
*/
public function sessionUpdate(int $id = 0, bool $rem = true) {
// Actualizamos la session
$this->session->update($id, $rem, TRUE);
$this->loadUser(true);
$this->DarMedalla();
}
luego buscar en la funcion
public function loginUser(...)
buscamos
$this->session->update($data['user_id'], $remember, TRUE);
$this->loadUser(true);
$this->DarMedalla();
y reemplazamos
$this->sessionUpdate($data['user_id'], $remember);
7 - Ir a inc/php/admin.php y arriba de
} elseif($action == 'configs'){
añadir
// Redes sociales
} elseif($action === 'socials') {
// CLASE MEDAL
require_once TS_CLASS . "c.socials.php";
$tsSocials = new tsSocials();
$smarty->assign('tsNetsSocials', [
'discord' => 'Discord',
'facebook' => 'Facebook',
'github' => 'Github',
'google' => 'Google'
]);
//
$tsTitle = 'Configurar redes sociales';
if(empty($act)) $smarty->assign('tsSocials', $tsSocials->getSocials());
// Editar o Nuevo tema
elseif(in_array($act, ['editar', 'nueva'])) {
$tsTitle = ucfirst($act) . ' red social';
if(!empty($_POST['save']) OR !empty($_POST['edit'])) {
$social = ($act === 'editar') ? $tsSocials->saveSocial() : $tsSocials->newSocial();
if($social) $tsCore->redirectTo($tsCore->settings['url'].'/admin/socials?save=true');
} else {
if($act === 'editar') $smarty->assign("tsSocial", $tsSocials->getSocial());
if($act === 'nuevo') $smarty->assign("tsError", $tsSocials->newSocial());
}
} elseif($act === 'borrar') {
if($tsSocials->eliminarRed()) $tsCore->redirectTo($tsCore->settings['url'].'/admin/socials?save=true');
}
8 - Ir a themes/TUTEMA/js/admin.js y agregar al final
$(document).ready(() => {
let redirectURI = $('#redirect_uri');
if(empty(redirectURI.val())) redirectURI.val(`${global_data.url}/discord.php`)
$('#social_name').on('change', () => {
let replace = $('#social_name option:selected').val() ;
redirectURI.val(`${global_data.url}/${replace}.php`);
});
$("#botonCopiar").on("click", function() {
redirectURI.select();
document.execCommand("copy");
window.getSelection().removeAllRanges();
$(this).html("Redirect URL ha sido copiado correctamente!");
setTimeout(() => $(this).html('Copiar'), 5000);
});
});
9 - Ir a themes/TUTEMA/js/cuenta.js al principio o final (donde quieran) agregan
function desvincular(social) {
$.post(`${global_data.url}/cuenta-desvincular.php`, { social }, req => {
if(req) {
mydialog.show();
mydialog.title('Bien');
mydialog.body('Ha sido desvinculado correctamente.');
mydialog.buttons(true, true, 'Listo', 'mydialog.close();', true, true, false);
mydialog.center();
}
});
}
10 - Ir a themes/TUTEMA/sections/main_header.tpl y arriba de
<link href="{$tsConfig.tema.t_url}/estilos.css" rel="stylesheet" type="text/css">
esto
<link href="{$tsConfig.tema.t_url}/socialButton.css" rel="stylesheet" type="text/css">
11 - Ir a themes/TUTEMA/templates/t.admin.tpl y debajo de
{include file='admin_mods/m.admin_configs.tpl'}
agregar
{elseif $tsAction == 'socials'}
{include file='admin_mods/m.admin_socials.tpl'}
12 - Ir a themes/TUTEMA/templates/admin_mods/m.admin_sidebar.tpl y debajo de
<li id="a_creditos"><span class="cat-title"><a href="{$tsConfig.url}/admin/creditos">Soporte y Créditos</a></span></li>
añadir
<li id="a_socials"><span class="cat-title"><a href="{$tsConfig.url}/admin/socials">Configurar redes</a></span></li>
13 - Ir a themes/TUTEMA/template/modules/m.cuenta_sidebar.tpl (agregalo donde quieras)
<div class="">
<h4>Tus redes sociales</h4>
{foreach from=$SocialMager key=nombre item=social}
<div class="btn-group-socials d-block">
<a class="btn btn--{$nombre}" href="{if $tsPerfil.socials.$nombre}javascript:desvincular('{$nombre}'){else}{$social}{/if}">
<span class="btn--icon"><span class="icon_social icon_{$nombre}"></span></span>
<span class="btn--text">{if $tsPerfil.socials.$nombre}Desv{else}V{/if}incular {$nombre}</span>
</a>
</div>
{foreachelse}
<div class="empty">Conexiones a tus redes sociales, pero aun {$tsConfig.titulo} no las ha configurado!</div>
{/foreach}
</div>
14 - Ir a themes/TUTEMA/template/t.login.tpl añaden, ya que con esto podrán iniciar sesión desde alguna red social
{if $SocialMager}
<div class="buttons-social">
{foreach from=$SocialMager key=nombre item=social}
<a class="btn btn--{$nombre} btn--only-icon btn-active" href="{$social}">
<span class="btn--icon"><span class="icon_social icon_{$nombre}"></span></span>
<span class="btn--text">Iniciar con {$nombre}</span>
</a>
{/foreach}
</div>
{/if}
15 - Ir a themes/TUTEMA/template/t.registro.tpl añaden, ya que con esto podrán crear cuenta desde alguna red social
{if $SocialMager}
<div class="buttons-social">
{foreach from=$SocialMager key=nombre item=social}
<a class="btn btn--{$nombre} btn--only-icon btn-active" href="{$social}">
<span class="btn--icon"><span class="icon_social icon_{$nombre}"></span></span>
<span class="btn--text">Crear cuenta con {$nombre}</span>
</a>
{/foreach}
</div>
{/if}
En el punto 14 y 15 tiene la clase 'btn--only-icon', el cual claramente muestra solo el icono, si quieren visualizar el texto deberán borrar dicha clase
Descargar los archivos
c.socials.php en inc/class/
m.admin_socials.tpl en themes/TUTEMA/templates/admin_mods
socialButtons.css en themes/TUTEMA/
¡Hola a todos! 👋
He estado pensando en una mejora que podría hacer más fácil y accesible nuestra comunidad de PHPost: implementar la posibilidad de registrarse e iniciar sesión usando redes sociales como Facebook, Google, Twitter, entre otras.
💡 ¿Por qué sería útil?
- Más rápido y sencillo: No sería necesario llenar formularios largos, solo unos clics y listo.
- Mayor comodidad: Muchas personas prefieren usar una cuenta existente en lugar de recordar otro usuario/contraseña.
- Aumenta la cantidad de usuarios: La facilidad de registro podría atraer a más personas a unirse y participar en la comunidad.
- Actualización del sistema: Esto también haría que PHPost se mantenga actualizado con tendencias modernas en plataformas web.

