Includerea unui fișier extern într-un post (și utilizarea căilor procesate)
Am o postare care include un tabel relativ mare care se actualizează frecvent. În loc să folosesc interfața web (mai lentă) pentru a actualiza postarea de fiecare dată, am instalat unul dintre plugin-urile "run PHP" și am introdus un mic fragment de cod PHP în corpul tabelului care deschide un fișier extern pe server și îl include în tabelul din postare. Astfel, pot edita fișierul local într-un editor de text rapid ori de câte ori este necesar, iar modificarea se reflectă imediat când pagina este încărcată (fără a necesita modificări în tabelele WordPress).
Acest lucru funcționează destul de bine și sunt în general mulțumit de el, dar există o mică problemă: calea către fișierul text extern este relativă la stocarea pe server (am folosit managerul de bibliotecă media pentru a-l stoca, iar pentru că folosesc funcția de multi-site și PHP este pe partea de server, calea este de forma "wp-content/blogs.dir/1/files/2011/02/foobar.txt"
). Căile către alte fișiere, cum ar fi imaginile pe care le folosește codul client-side precum JavaScript, sunt relative la URL. Acest lucru nu este ideal din mai multe motive.
Așadar, am două întrebări:
- Există o metodă mai bună de a include conținut extern într-o postare decât utilizarea PHP?
- (sau 1b.) Dacă nu, există o modalitate mai bună - adică mai consistentă - de a accesa fișierele? (Adică, o modalitate de a face ca PHP să folosească căi relative la URL în loc de căi relative la server?)
Clarificare:
În postare, am ceva de genul acesta (codul este scris din memorie, așa că ignorați orice erori):
…
<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)); //fără clearstatcache; fișierul TXT nu se actualizează *atât* de des
print($data);
fclose($fh);
?>
<tbody>
</table>
…
Unde fișierul text conține ceva de genul:
<tr><td>Blah</td><td>123</td></tr>
<tr><td>Foobar</td><td>asd</td></tr>
<tr><td>Test</td><td>555</td></tr>
…
Când pagina este încărcată, PHP-ul din postare este executat și preia rândurile tabelului din fișierul extern, reflectând orice modificări făcute extern fără a fi nevoie să trec prin WordPress pentru a face acest lucru.
Există, de asemenea, niște JavaScript înainte de tabel care setează unele imagini în funcție de o instrucțiune switch - imaginile au fost importate cu biblioteca media - ceva de genul:
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) Da, există metode mai bune... una ar fi să folosești un shortcode în loc să stochezi PHP în baza ta de date. Scrie și înregistrează un callback pentru shortcode care citește fișierul tău și returnează conținutul, apoi înlocuiește secțiunea <?php ... ?>
din post cu shortcode-ul. De asemenea, poți citi fișierul cu file_get_contents();
, ceea ce îți economisește câteva linii de cod.
2) Ai putea scrie o funcție care să simuleze asta, dar beneficiul ar fi prea mic pentru a justifica efortul.
DAR: În loc să hardcodezi calea fișierului în shortcode, poți obține calea acestuia prin get_attached_file($attachment_id)
.

Cât de des este actualizat acest fișier? De ce nu preiați datele și le stocați într-un transient cu o limită de timp. În acest fel, când este servit, nu procesați nimic și este de asemenea stocat în cache (și problema dvs. cu URL-ul este probabil rezolvată).
De obicei, ați compara și valoarea stocată în transient cu cele mai recente date și doar ați actualiza dacă există o modificare (folosind md5
sau md5_file
).
