Incluir un archivo externo en una publicación (y usar rutas procesadas)
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:
- ¿Hay una mejor manera de incluir contenido externo en una publicación que usar PHP?
- (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;
…
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)
.

¿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
).
