Incluir un archivo externo en una publicación (y usar rutas procesadas)

26 feb 2011, 19:41:58
Vistas: 1.08K
Votos: 2

Tengo una publicación que incluye una tabla relativamente grande que se actualiza con frecuencia. En lugar de usar la interfaz web (más lenta) para actualizar la publicación cada vez, instalé uno de los plugins de "ejecutar PHP" y agregué un pequeño fragmento de código PHP en el cuerpo de la tabla que abre un archivo externo en el servidor y lo coloca en la tabla de la publicación. De esta manera, puedo editar el archivo localmente en un editor de texto responsivo según sea necesario y el cambio se refleja inmediatamente cuando se sirve la página (sin necesidad de realizar cambios en las tablas de WordPress).

Esto funciona bastante bien y en general estoy satisfecho con ello, pero hay un pequeño inconveniente: la ruta al archivo de texto externo es relativa al almacenamiento en el servidor (usé el administrador de la biblioteca de medios para almacenarlo, y debido a que estoy usando la función multisitio y PHP es del lado del servidor, la ruta tiene la forma "wp-content/blogs.dir/1/files/2011/02/foobar.txt"). Las rutas a otros archivos, como imágenes, que el código del lado del cliente como JavaScript usa, son relativas a la URL. Obviamente, esto no es ideal por varias razones.

Entonces, tengo dos preguntas:

  1. ¿Hay una mejor manera de incluir contenido externo en una publicación que usar PHP?
  2. (bueno, 1b.) Si no, ¿hay una mejor manera - es decir, más consistente - de acceder a los archivos? (Es decir, ¿una forma de que PHP use rutas relativas a la URL en lugar de rutas relativas al servidor?)



Aclaración:

En la publicación, tengo algo como esto (el código es de memoria, así que ignora cualquier error):

…
  <table>
    <thead><th>foo</th><th>bar</th><thead>
    <tbody>
      <?php
       $fn  ="wp-content/blogs.dir/1/files/2011/02/foobar.txt";
       $fh  =fopen($fn, "r");
       $data=fread($fh, filesize($fn)); //no clearstatcache; el archivo TXT no se actualiza *tan* frecuentemente
       print($data);
       fclose($fh);
      ?>
    <tbody>
  </table>
…

Donde el archivo de texto contiene algo como esto:

<tr><td>Blah</td><td>123</td></tr>
<tr><td>Foobar</td><td>asd</td></tr>
<tr><td>Test</td><td>555</td></tr>
…

Cuando se sirve la página, el PHP en la publicación se ejecuta y extrae las filas de la tabla del archivo externo, recogiendo cualquier cambio que haya realizado externamente sin tener que pasar por WordPress para hacerlo.

También hay algo de JavaScript antes de la tabla que establece algunas imágenes según una declaración switch - las imágenes se importaron con la biblioteca de medios - algo como esto:

case 'a': element.style.backgroundImage='url(/blogs/foobar/files/2011/02/A.png)'; break;
case 'b': element.style.backgroundImage='url(/blogs/foobar/files/2011/02/B.png)'; break;
…
5
Comentarios

¿Qué tipo de datos estás almacenando? ¿Cómo se están mostrando; en el cuerpo de una página? ¿El sitio está en la web, y si es así, cuál es la URL de la página web que lo almacena? ¿Dónde estás usando "ejecutar PHP"; en un widget? Entender tu caso de uso puede ayudarnos a recomendar la mejor opción.

MikeSchinkel MikeSchinkel
26 feb 2011 22:53:23

He actualizado arriba para abordar tus preguntas.

Synetech Synetech
27 feb 2011 01:06:50

Supongo que el php está en la plantilla, no en la publicación, ¿verdad?

Chris_O Chris_O
28 abr 2011 10:59:53

@Chris_O, ¿qué plantilla? ¿El tema? No, está en la publicación.

Synetech Synetech
28 abr 2011 21:26:16

En lugar de abrir el archivo, leerlo, etc... Simplemente usa la función readfile. Lee un archivo y lo envía directamente a la salida. Una línea de código. Ver http://www.php.net/manual/en/function.readfile.php

Otto Otto
11 feb 2012 18:41:07
Todas las respuestas a la pregunta 2
1

1) Sí, hay mejores formas... una sería usar un shortcode en lugar de almacenar PHP en tu base de datos. Escribe y registra un callback de shortcode que lea tu archivo y devuelva el contenido, luego reemplaza tu sección <?php ... ?> en la publicación con el shortcode. Además, puedes leer el archivo con file_get_contents();, lo que te ahorra algunas líneas de código.

2) Podrías escribir una función que simule eso, pero el beneficio sería demasiado mínimo como para justificar el esfuerzo.

PERO: En lugar de codificar la ruta de tu archivo directamente en el shortcode, puedes obtener su ruta mediante get_attached_file($attachment_id).

27 feb 2011 07:15:12
Comentarios

No estoy familiarizado con los transitorios; investigaré al respecto.

Synetech Synetech
28 may 2011 16:19:17
0

¿Con qué frecuencia se actualiza este archivo? ¿Por qué no extraer los datos y almacenarlos en un transitorio con un límite de tiempo? De esa manera, cuando se sirva, no estarás procesando nada y también estará en caché. (Y probablemente también se resuelva tu problema de URL).

Normalmente también compararías el valor del transitorio almacenado con los datos más recientes y solo lo actualizarías si hay un cambio (usando md5 o md5_file).

http://codex.wordpress.org/Transients_API

28 may 2011 14:05:23