Includere un File Esterno in un Post (e Utilizzare Percorsi Elaborati)
Ho un post che include una tabella relativamente grande che viene aggiornata frequentemente. Invece di utilizzare l'interfaccia web (più lenta) per aggiornare il post ogni volta, ho installato uno dei plugin "esegui PHP" e inserito un breve codice PHP nel corpo della tabella che apre un file esterno sul server e lo inserisce nella tabella del post. In questo modo, posso modificare il file localmente in un editor di testo reattivo quando necessario e la modifica viene riflessa immediatamente quando la pagina viene servita (senza richiedere modifiche alle tabelle di WordPress).
Funziona abbastanza bene e sono generalmente soddisfatto, ma c'è un piccolo problema: il percorso del file di testo esterno è relativo all'archivio sul server (ho utilizzato il gestore della libreria multimediale per memorizzarlo e, poiché sto utilizzando la funzionalità multisito e PHP è lato server, il percorso è del tipo "wp-content/blogs.dir/1/files/2011/02/foobar.txt"
). I percorsi di altri file come immagini che il codice lato client come JavaScript utilizza sono relativi all'URL. Questo ovviamente non è ideale per diversi motivi.
Quindi ho due domande:
- C'è un modo migliore per includere contenuti esterni in un post senza usare PHP?
- (beh, 1b.) Se no, c'è un modo migliore - cioè più coerente - per accedere ai file? (Ovvero, un modo per far sì che PHP utilizzi percorsi relativi all'URL invece che percorsi relativi al server?)
Chiarimento:
Nel post, ho qualcosa del genere (il codice è scritto a memoria, quindi ignorate eventuali errori):
…
<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)); //nessun clearstatcache; il file TXT non viene aggiornato *così* spesso
print($data);
fclose($fh);
?>
<tbody>
</table>
…
Dove il file di testo contiene qualcosa del genere:
<tr><td>Blah</td><td>123</td></tr>
<tr><td>Foobar</td><td>asd</td></tr>
<tr><td>Test</td><td>555</td></tr>
…
Quando la pagina viene servita, il PHP nel post viene eseguito e inserisce le righe della tabella dal file esterno, raccogliendo eventuali modifiche apportate esternamente senza dover passare attraverso WordPress.
C'è anche del JavaScript prima della tabella che imposta alcune immagini secondo uno switch - le immagini sono state importate con la libreria multimediale - qualcosa del genere:
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ì, ci sono modi migliori... uno sarebbe usare uno shortcode invece di memorizzare php nel tuo database. Scrivi e registra una callback per lo shortcode che legge il tuo file e restituisce il contenuto, poi sostituisci la sezione <?php ... ?>
nel post con lo shortcode. Inoltre, puoi leggere il file con file_get_contents();
, risparmiando alcune righe di codice.
2) Potresti scrivere una funzione che simuli questo comportamento, ma il beneficio sarebbe troppo minimo per giustificare lo sforzo.
MA: Invece di hardcodare il percorso del file nello shortcode, puoi ottenere il suo percorso tramite get_attached_file($attachment_id)
.

Con quale frequenza viene aggiornato questo file? Perché non recuperare i dati e memorizzarli in un transient con un limite di tempo. In questo modo, quando viene servito, non stai elaborando nulla ed è anche memorizzato nella cache (e anche il tuo problema con l'URL probabilmente viene risolto).
Tipicamente si confronta anche il valore memorizzato nel transient con i dati più recenti e lo si aggiorna solo se c'è un cambiamento (utilizzando md5
o md5_file
).
