Insertando contenido dinámico en una página

18 abr 2015, 09:39:39
Vistas: 28.6K
Votos: 5

Veo que este tema surge regularmente pero no he visto una respuesta a mi requerimiento específico aún.

Estoy tratando de usar una página de WordPress como plantilla e insertar contenido proveniente de una base de datos (aproximadamente 20 campos de texto, incluyendo nombres de archivos de imágenes) basado en un ID pasado como parámetro URL (e índice de mi base de datos). Por ejemplo: www.example.com/examplepage/?pid=123

Antes de WordPress, podía hacer esto fácilmente en PHP ejecutando código para obtener un registro de la base de datos y luego escribir HTML intercalado con esos campos.

Tengo un plugin en WordPress que me permite ejecutar algunos fragmentos de código PHP en la página, pero eso está en el cuerpo de la página y creo que el encabezado ya se ha escrito. El encabezado tiene campos como título y meta descripción que me gustaría que fueran poblados con contenido dinámico.

He visto plugins para la gestión tipo CMS de listados inmobiliarios, películas, etc., pero mi manejo de base de datos es un poco inusual, así que tengo que tomar un enfoque de construcción personalizada.

Entiendo que posiblemente necesite hacer algún trabajo en el script functions.php de mi tema para profundizar en el renderizado de páginas de WordPress, pero me gustaría tener cuidado de no alterar las páginas/posts generales de mi sitio. Es solo esta página especial la que aceptará parámetros y cargará el contenido apropiado.

Agradecería algunos consejos sobre los pasos que necesito tomar.

3
Comentarios

Entonces, tu pregunta es cómo establecer o modificar el título y las meta etiquetas para una plantilla de página?

cybmeta cybmeta
18 abr 2015 11:32:38

No solo el título y las meta etiquetas, sino también la población de contenido en el cuerpo de la página. Todo a partir de contenido obtenido en una sola consulta a la base de datos buscando por pid.

Warren Vick Warren Vick
18 abr 2015 11:39:42

Dijiste que ya sabes cómo poblar contenido usando PHP, no hay nada que te impida incluir ese código PHP en una plantilla de página.

cybmeta cybmeta
18 abr 2015 11:50:15
Todas las respuestas a la pregunta 3
7

Al construir una plantilla de página, puedes insertar en el contenido de esa plantilla lo que desees y utilizar cualquier fragmento de PHP que necesites. Así que puedes continuar haciéndolo como lo harías normalmente en PHP. Por ejemplo, esta podría ser tu plantilla de página:

<?php
/*
Template Name: Mi plantilla
*/
get_header();

?>
<main>

    <?php

    if( isset( $_GET['pid'] ) ) {

        // Rellena tu contenido dinámico aquí

    }

    ?>


</main>
<?php get_footer(); ?>

Pero tienes razón acerca del título y las metaetiquetas del documento, es posible que ya estén configuradas. Aquí necesitas enlazarte al filtro wp_title y a la acción wp_head, utilizando la función is_page_template para verificar si estás en la plantilla de página.

Por ejemplo, supongamos que el nombre de tu archivo de plantilla de página es algo como page-mitemplate.php y está ubicado en la raíz de tu tema:

add_filter( 'wp_title', function( $title, $sep ) {

    if( is_page_template( 'page-mitemplate.php' ) ) {

        // Modifica el $title aquí
        $title = 'mi nuevo título';

    }

    return $title;

}, 10, 2 );

add_action( 'wp_head', function() {

    if( is_page_template( 'page-mitemplate.php' ) ) {

        // Imprime tus metaetiquetas aquí
        echo '<meta name=....>';

    }

} );

El problema

Existe un gran problema con las etiquetas <meta>. WordPress no tiene una forma estándar de gestionar las etiquetas <meta> del documento. Si utilizas algún plugin que añada etiquetas <meta>, no podrás sobrescribirlas a menos que el plugin ofrezca una manera de hacerlo.

Referencia

18 abr 2015 11:42:02
Comentarios

Gracias por eso. Encontré una referencia a las plantillas de páginas de WordPress y voy a intentarlo. Respecto a tus notas sobre las etiquetas <meta>, sospecho que mi plugin Yoast va a interferir. ¡Votaría ++ pero soy nuevo y aún no tengo derechos de voto!

Warren Vick Warren Vick
18 abr 2015 15:00:59

Lo siento pero no te entiendo. Dijiste que estabas usando una plantilla de página, así que asumí que sabías cómo construir una plantilla de página; no entiendo lo que dices ahora sobre una referencia a plantillas de página. Creo que respondí exactamente lo que preguntaste, así que creo que mi respuesta debería marcarse como aceptada; si no, por favor dime por qué esta respuesta no responde a tu pregunta. Por cierto: tu reputación actual es suficiente para aceptar respuestas.

cybmeta cybmeta
18 abr 2015 16:59:06

Quizás te malinterpreté. Dijiste "usar una página de WordPress como plantilla" y pensé que hablabas de plantillas de páginas de WordPress; por eso comencé la respuesta con "Como estás construyendo una plantilla de página".

cybmeta cybmeta
18 abr 2015 17:35:11

Lo siento... soy nuevo en StackExchange y asumí que votar era la señal de aprobación. Ahora he encontrado la marca de verificación. Tienes razón en que usé la palabra "plantilla" de manera genérica en mi pregunta, pero ahora veo que mi mejor camino sería usar una "Plantilla de Página Especializada" de WordPress que funciona para una página en particular. Puedo construir fácilmente mi trabajo con la base de datos PHP allí. Sería bueno mantener el diseño de la página e inyectar mis campos de la base de datos... Sospecho que los shortcodes pueden ser mis amigos para esto? Gracias de nuevo por la respuesta exhaustiva.

Warren Vick Warren Vick
20 abr 2015 19:59:38

Como una plantilla de página es un archivo PHP, puedes construirlo como quieras. Con o sin shortcodes. Usa shortcodes si deseas mostrar información en cualquier otro lugar, no solo en la plantilla de página. Quiero decir, podrías usar una función PHP en la plantilla de página y usar esa función también como callback para un shortcode; pero los shortcodes no son necesarios en absoluto para una plantilla de página. Aquí puedes ver cómo un shortcode es solo un marcador de posición para una función PHP y cómo puedes usarlos por separado.

cybmeta cybmeta
20 abr 2015 20:16:56

Gracias cybmeta. Tengo una plantilla personalizada funcionando y he elegido implementar el diseño de la página en la propia página. Los shortcodes han demostrado ser una forma útil de configurar campos de base de datos/calculados y colocarlos en el contenido de la página. Mi único problema es establecer el título de la página y la meta descripción usando add_filter(). Estoy usando Genesis y sospecho que los elementos SEO están interfiriendo. Preguntaré sobre esto en otra publicación.

Warren Vick Warren Vick
24 abr 2015 14:34:38

He actualizado la respuesta, el código estaba mal. Ahora debería funcionar (lo he probado y uso código similar en varios sitios web). Lamentablemente no puedo ayudarte con Genesis ya que es un software de terceros que no conozco; intenta probar el código sin Genesis para ver si el problema es un conflicto con Genesis o no.

cybmeta cybmeta
24 abr 2015 15:00:06
Mostrar los 2 comentarios restantes
1

Puede que me esté perdiendo algo, pero:

Si solo necesitas el 'pid', por ejemplo, y es parte de la URL, entonces es bastante simple, ¿no?

En la plantilla de página 'examplepage', simplemente haz:

$mypid = $_GET['pid'];

y luego continúa con la consulta SQL basada en ese valor y muestra una respuesta.

Si prefieres algo más basado en AJAX, cuando el usuario llegue a 'examplepage', toma el 'pid' y agrégalo como una clase o atributo de datos en un div vacío. Por ejemplo, llamado: 'results-container'

<?php $mypid = $_GET['pid']; ?>
<div class="results-container" mypid="<?php echo $mypid; ?>"></div>

Y luego haz que un script de JavaScript se ejecute cuando el documento esté listo, que lea el atributo mypid en ese div y haga una solicitud fetch separada. De esta manera, la página puede cargarse y mostrar un estado de 'cargando' y algún contenido preliminar mientras los resultados se cargan.

Espero que tenga sentido.

-¡Escrito con dedos gordos en un teléfono móvil! Aaaaah.

18 abr 2015 10:01:26
Comentarios

Si el contenido dinámico estuviera solo en el cuerpo, entonces tendrías razón, sería así. Pero también necesito sobrescribir elementos en el encabezado como el título de la página y la meta descripción.

Warren Vick Warren Vick
18 abr 2015 11:27:28
0

Hice esto yo mismo recientemente. Puede que llegue tarde a la fiesta, pero en caso de que otros quieran saber cómo, estos fueron mis pasos en un entorno de WordPress:

  1. Crea una función que lea el parámetro de la URL, como:

    function detalles_Pagina($atts)
      {
      global $wpdb; 
    
    
     // Obtener el registro de la base de datos para estos detalles
     $DatabaseId = $_GET['pid'];
     if(!is_numeric ($DatabaseId))
       {
       // IR A PÁGINA NO ENCONTRADA. LA PÁGINA NO ES VÁLIDA.
       header('Location: /pagina-no-encontrada/');  
      return;
      }
    
     GENERA TU CÓDIGO DE PÁGINA AQUÍ
    }
    

Ahora crea un shortcode para esta función o úsala en la plantilla de tu página. Funcionalmente hablando, esta es otra forma de hacer una plantilla de página.

         add_shortcode('PAGINA_DETALLES', 'detalles_Pagina');

Ahora añade el shortcode a la página específicamente definida (o plantilla).

Para cambiar el encabezado para que coincida con tus datos, asegúrate de que la llamada add_action esté en el bucle principal o en functions.php. De lo contrario, tendrás una condición de carrera.

 add_action( 'wp_head', 'MMD_listings_add_custom_meta', 10 );
 function add_custom_meta()
    {
   $slug = basename(get_permalink());  // Lo uso para la página en particular
   if(  $slug == 'detalles')
      {
     $Name = $_GET[ 'Name' ];
     $Desc = $_GET[ 'Desc' ];
     $Logo = $_GET[ 'Logo' ];
    ?>   
    <meta content="<?php echo $Name; ?>>"/>
    <meta content="<?php echo $Desc; ?>">
   <?PHP
   }
 }
9 jun 2019 03:13:56