Incluir metadatos de forma dinámica

Iniciado por Marciano_79, 26 Junio 2016, 02:43 AM

0 Miembros y 1 Visitante están viendo este tema.

Marciano_79

Hola a todos... quiero que me echen una mano con este tema, como dice el titulo quiero obtener metadatos diferentes para cada página de mi sitio web.. como el titulo, descripción y keywords... la mayoría de mis paginas pasan por GET (no todas) y para ser honesto buscando por todo google no pude dar a como realizar esta tarea... porfavor alguien que me pueda dar una idea, orientación o pueda compartir un código, quedaría muy agradecido... estos son mis archivos de una galería de fotos.. head.php, metadatos.php, galerias.php y galeria-fotografica.php


head.php
Código (php) [Seleccionar]
<!doctype html>
<html lang="es-ES">
<head>
<head profile="http://www.midominio.com">
<?php
include('panel/_setup.php');
include 
"php/metadatos.php";
?>


<link href="includes/css/menu.css" rel="stylesheet" type="text/css">
<link href="includes/css/stylenew.css" rel="stylesheet" type="text/css">

</head>

<?php include "php/navimenu.php";?>
</header>



metadatos.php
Código (php) [Seleccionar]
<meta name="Title" content="titulo que corresponda para cada página">
<meta name="Description" content="descripcion que corresponda para cada página">
<meta name="keywords" content="palabra1, palabra2,  palabra3, etc">


la idea "talvez" seria que quedara algo así, si es que sirve para mi propósito
metadatos.php
Código (php) [Seleccionar]
<meta name="title" content="<?php echo $title?>">
<meta name="description" content="<?php echo $description?>">
<meta name="keywords" content="<?php echo $keywords?>">


galerias.php
Código (php) [Seleccionar]
<?php
include('panel/_setup.php');
include 
"php/head.php"
?>


<div id="principal">
<?php
if( isset( 
$_GET['cat'] ) ){  
    $id $_GET['cat'];
        
$consulta ="code sql;   

echo"
<title>Galería Fotográfica $id </title>";          
echo "
<h1>Fotografía</h1>";

}
echo '<div id="
listado">';
$filas = mysqli_query($cnx$consulta);
while( 
$columna = mysqli_fetch_assoc($filas)){
  
$id = $columna['IDGALERIA'].'-'. $columna['TITULO'];
              
$subconsulta = "code sql";
  
$filas2 = mysqli_query($cnx$subconsulta);
  
$datos = mysqli_fetch_assoc($filas2);
 
  echo '<div>';  
  echo "
<h2>$columna[TITULO]</h2>";
  echo "
<div>$columna[FECHA]</div>";
  
  }
  echo "
<p>". nl2br( $columna['DESCRIPCION'])."</p>";
  echo "
<a href='galeria-fotografica.php?gal=$id'>VER GALERIA</a>";
  echo '</div>';
  
  }
  echo '</div>';

mysqli_close(
$cnx);
?>

</div>
<?php include "php/pie_pagina.php";?>



galeria-fotografica.php
Código (php) [Seleccionar]
<?php
include('panel/_setup.php');
include 
"php/head.php"
?>

<div id="principal">  
<?php
    
if( isset( $_GET['gal'] ) ){
$id $_GET['gal'];
$consulta "code sql";
$filas mysqli_query($cnx$consulta);
$columna mysqli_fetch_assoc($filas);
echo "<title>Fotografía, $columna[TITULO]</title>";
echo "<h2>$columna[TITULO]</h2>";
        echo 
"<p>$columna[DESCRIPCION]</p>";
        echo 
'<a href="javascript:history.back(-1);" title="Ir la página anterior">VOLVER ATRAS</a>';

          echo 
'</div>';   
}

mysqli_close($cnx);
?>

</div>
<?php include "php/pie_pagina.php";?>


desde ya muchas gracias a quien me pueda ayudar... Saludos!

gAb1

No estoy seguro de como es la estructura de tu sitio, supongo que tienes un archivo main.php donde incluyes todas las demás páginas.

Tampoco sé como estás haciendo esto, el incluir cada página según la url. Una manera eficiente para esto y además para saber que metadatos incluir, es usar un array whitelist con los nombres de los url permitidos, cada uno apuntando a su archivo .php para luego incluirlos en main.php con un array_key_exists (o cualquier otra manera para hacer esto).

Yo lo hago de la siguiente manera: En index.php tengo un array donde tengo listadas todas las páginas y url de mi sitio. Por ejemplo, para saber cual es el títutlo de la página hago lo siguiente:

Código (php) [Seleccionar]
// index.php

$includes = [
    '/pagina'       => 'pagina.php',
    '/pagina2'      => 'pagina2.php'
];

$include = array_key_exists($url, $includes) ? $url : '/404';

//GET TITLE
$title = $lang->getText($include);

include($pages . 'main/main.php');

// main.php

// aqui incluyes tus páginas, (Dentro de <body>)
include($includes[$include]);


(nota: lo que hago en $title es pasar la url a una clase que coge el texto de memcached o de la db si es la primera vez y todavía no está cacheado)

De esta manera ya sabes en que página estás y puedes saber que información incluir de manera dinámica.

También te sirve por si quieres incluir css, js, contenido, etc... especifico de la página, con un simple if:

Código (php) [Seleccionar]
if ($include == '/pagina') {}

Un consejo a la hora de imprimir de php a html, usa el shorthand que viene activado por defecto en php 5.4:

Código (php) [Seleccionar]
<meta name="title" content="<?= $title ?>">

Cuando hay bastantes se nota la diferencia. Solo sirve para imprimir, para todo lo demás abre con los tags completos.

Marciano_79

Hola... muchas gracias por tu respuesta.!! Mira la verdad aún no defino  cual sería la mejor forma de estructurar mi sitio... esto es porque quiero la mejor opción para traer los metas, por ello has tocado un punto muy importante que se me olvido señalar en un principio... por ahora las paginas solo las veo por un archivo, navimenu.php  donde tengo un menú de esta forma...

Código (php) [Seleccionar]
<li>
   <a href="">Fotografía</a>
                <ul>
<?php 
$consulta_fotografia 
=<<<SQL
aqui esta mi codigo sql
SQL;
$listas mysqli_query($cnx$consulta_fotografia);
          while(
$id mysqli_fetch_assoc$listas ) ) {
           echo"<li><a href='galerias.php?cat=$id[NOMBRE_CATEGORIA]'>$id[NOMBRE_CATEGORIA]</a>";
}
   ?>

</ul>                     
             </li>


Tenía en mente preparar la estructura de forma modularisada, creando un archivo conf.php definiendo módulos por defecto, etc... algo así.

Código (php) [Seleccionar]
$conf['home'] = array(
'archivo' => 'home.php',
'imagen' => ' /images/banner.jpg',
'titulo' => ' titulo del home',
'layout' => 'template.php'
   
);


$conf ['galerias'] = array(
'archivo' => 'galeria-fotografica.php',
'imagen' => ' /images/banner.jpg',
'titulo' => 'titulo de galerias',
'layout' => LAYOUT_DEFECTO 
);


Pero no estoy seguro, ni creo que sea  lo mejor... tu me podrías ayudar hacer bien la estructura así como lo haces tú, para que me quede de mejor forma, prefiero tu ejemplo lógicamente ya que tú tienes más control sobre él y yo podría comprender de mejor forma...  si me puedes ayudar siempre y cuando tengas tiempo, como tendría que preparar bien mi index.php, a demás de crear el archivo main.php para incluir las paginas...? desde ya muy agradecido por tu tiempo.! saludos..

gAb1

El index.php lo empezarias de la siguiente manera:

1. Con el require de tu framework, si usas uno.
2. Seguidamente inicializas tus clases.
3. Coges el url de $_SERVER['REQUEST_URI'] (comprobandolo y limpiandolo).
4. Inicias la sesion (si hay usuarios).
5. Y haces la comprobación del login.

Hasta aquí tendrías algo así:

Código (php) [Seleccionar]
ini_set('display_errors', 1); // se cambia a 0 en producción

define('_NDTP', 'Nombre de tu Proyecto'); // o lo que quieras, luego vemos para que sirve esto

header('Content-Type: Text/HTML; Charset=UTF-8');

require('config-web.php'); //aquí yo declaro parametros como url a static y path_framework
require($path_framework . 'aet.php'); // incluyo mi framework

//$flood = new FloodDetection();
//$flood->check();

$web_user       = new web_user();
$functions      = new functions();
$property       = new Property();
$AddressBook    = new AddressBook();

//CHECK URL WITH SECURITY
$url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$url = $functions->esc_url($url);

if (substr($url, -1) == '/')
    $url = substr($url, 0, -1);

$web_user->sec_session_start(); // mi clase custom para la sesión, es recomendable configurarla bien

$client = $web_user->login_check(); // FALSE OR CLIENT


Si vas a tener usuario, ahora mismo sabríamos si el usuario se ha identificado o no. Si no está identificado entonces $client sera FALSE, pero si lo ha hecho entonces $client será un objeto de clase con la información del usuario (y podremos llamar las funciones de la clase client()).

Ahora viene lo de las url:

1. Hay que comprobar, con un if por ejemplo, si el usuario se ha logueado o no, para mostrar unas páginas u otras.
2. Crear un array para cada caso, que será un whitelist de lás páginas disponibles.

Sería algo así el código:

Código (php) [Seleccionar]
$pages  = 'pages/';

if ( FALSE !== $client ) {

    // client's most needed data
    $clientId       = $client->getId();
    $isParticular   = $client->getIsParticular();

    // en caso de necesitar incluir código antes del output (principalmente para hacer redirecciones header)
    // en caso de que ejecutarse el código de estos archivos, debería o bien hacer la redireccion o terminar la ejecución con un die()
    switch ($url) {
        case '/get'     : include($pages . 'get.php');             break; // header('Location: /...') or die('error');
        case '/post'    : include($pages . 'post.php');            break; // header('Location: /...') or die('error');
        case '/logout'  : include($pages . 'headers/logout.php');  break; // header('Location: /...') or die('error');
    }

    // el whitelist de las páginas disponibles solo para los usuarios registrados
    $includes_var = [
        '/test'                     => $pages . 'test.php',
        '/account'                  => $pages . 'account.php',
        '/property'                 => $pages . 'property.php',
        '/change_pwd'               => $pages . 'change_pwd.php'
    ];

}
else {

    // aquí lo mismo, si se ejecuta el script debe o bien redirigir o detenerlo con die en caso de error.
    // para que no se muestre el resto de la página despues del error
    switch ($url) {
        case '/activateAccount' : include($pages . 'activate_acc.php');     break; // header('Location: /...') or die('error');
        case '/login'           : include($pages . 'headers/login_post.php'); break; // header('Location: /...') or die('error');
    }

    // otro whitelist de las páginas disponibles en caso de no haberse identificado
    $includes_var = [
        '/test'                     => $pages . 'test.php',
        '/404'                      => $pages . '404.php',
        '/login'                    => $pages . 'login.php',
        '/resend_email'             => $pages . 'resend_email.php'
    ];

}

// si $url == '' entonces le damos el url de la página principal
$url = $url ?: '/home';

// aqui tenemos el whitelist de las páginas que siempre están disponibles para todos
$includes = [
    '/404'                      => $pages . '404.php',
    '/help'                     => $pages . 'help.php',
    '/home'                     => $pages . 'home.php'
];

$includes = array_merge($includes, $includes_var);


Como puedes ver, ahora tenemos un array con todas las páginas permitidas.

Lo siguiente sería saber cual es el título de la página, y todo lo demás que dependa de la página actual, como los meta:

Código (php) [Seleccionar]
//CHECK TRANSLATION
$lang   = locales::instantiate($client);

$include = array_key_exists($url, $includes) ? $url : '/404';

//GET TITLE
$title  = $lang->getW($include);


Como te comenté anteriormente, tengo una clase abstracta que inicializa un idioma basado en diferentes factores (primero la opción que haya elegido el usuario en su cuenta y segundo el idioma de su navegador), una vez inicializada la función se le pueden pasar keys (que en este caso sería la url) y te devuelve el texto correspondiente. Tu puedes hacerlo como quieras.

Y por ultimo se incluye el main.php:

Código (php) [Seleccionar]
include('pages/main/main.php');

Bien, ahora vamos a usar el define() de arriba del todo, esto es basicamente para que los archivos no se accedan directamente y solo puedan ser mostrados mediante el index.php.

También aprovecho para mostrarte como incluir las páginas dentro de main.php:

La estructura del archivo main.php es muy simple, primero se comprueba con defined (por lo indicado arriba) y luego se empieza la estructura normal del html. Ahora incluir las páginas, yo te recomiendo que lo hagas dentro de la etiqueta <main> (que debería ir dentro de <body>):

main.php:
Código (php) [Seleccionar]
<?php

    
// Esto quiere decir que si no esta definido el key se termina la ejecución y no se muestra nada
    // solo debería ocurrir cuando se intenta acceder directamente al archivo y no cuando se incluye
    // ya que en index.php está definido el key. Esto habría que ponerlo en todos los archivos de tu web
    
defined('_NDTP') or die();

?>

<!DOCTYPE html>
<html>

    <head>

        <meta http-equiv="Content-Type" content="Text/HTML" charset="UTF-8" />
        <meta name="keywords" content="google" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />

        <title>NombreWeb | <?= $title ?></title>

        <meta name="author" content="" href="" />
        <meta name="copyright" content="&copy; NombreWeb <?= date("Y") ?>" />

        <link rel="shortcut icon" href="<?= $path_static; ?>images/favicon.ico" />
        <link rel="StyleSheet" type="text/CSS" media="all" href="<?= $path_static; ?>css/styles.css" />

        <script type="text/javascript" src="<?= $path_static ?>js/scripts.js"></script>

    </head>

    <body>

        <header>

        </header>

        <main>

<?= include($includes[$include]); ?>

        </main>

        <footer>

        </footer>

    </body>

</html>


Otra cosa importante son los archivos estáticos, como imagenes, jscripts, css, etc. Estos deberían ir en un subdominio, propiamente llamano static.tuweb.com y que preferiblemente tenga php desactivado, más que nada por si permites subir archivos que no se ejecuten.

Pero la razón por la que hay que hacer esto así es porque tu dominio principal no va a aceptar urls normales, como por ejemplo /jscripts/scripts.js o /images/logo.jpg ya que vas a usar las friendly urls para navegar como /home o /account, etc... Que basicamente son los indexes de tu array $includes, estos deben ser las urls.

Para ello tienes que poner el siguiente código en tu .htaccess:

Options -Indexes

DirectoryIndex index.php

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index\.php$ - [L]
RewriteRule . index.php [L]
</IfModule>


Esto lo que hace es basicamente redirigir todas las peticiones a tu archivo index.php que ahora hace de router. Apache ya no lo usas para navegar por tu sitio, ahora es tu index.php el que se encarga de eso, pero para ello, hay que pasarle todas las peticiones para saber cual es la url a acceder.

Cualquier duda mañana te respondo que hay sueño  :P Espero que se haya entendido  :silbar:

Marciano_79

#4
Maestro.. realmente te pasastes!! reviso con detalle el código y te comento... eso si, no uso usuarios, no es un foro ni blog, solo más adelante tendrán en algunos apartados o artículos para comentar de forma libre, sin previo registro... muchas gracias.!!  ;-) amm por otra parte no estoy usando framework para desarrollo, solo uso un framework para los css como lo es Bootstrap.. saludos!

gAb1

No hay problema, simplemente omites las partes donde inicias la sesión php y compruebas el login, y simplemente un solo array (ya no necesitas el array_merge() ni el if) y si no tienes framework no necesitas incluir ni inicializar nada.

Si no necesitas usar todo lo que ofrece bootstrap y quieres aligerar tu web (y la carga de los clientes y reducir el consumo de ancho de banda) leete la respuesta que puse en el mensaje en desarrollo web donde explico como hacer diseño responsive basico y facil sin necesidad de usar un framework.