Includere un File Esterno in un Post (e Utilizzare Percorsi Elaborati)

26 feb 2011, 19:41:58
Visualizzazioni: 1.08K
Voti: 2

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:

  1. C'è un modo migliore per includere contenuti esterni in un post senza usare PHP?
  2. (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;
…
5
Commenti

Che tipo di dati stai memorizzando? Come vengono visualizzati; nel corpo di una pagina? Il sito è online e, in caso affermativo, qual è l'URL della pagina web che li memorizza? Dove stai usando "eseguire PHP"; in un widget? Comprendere il tuo caso d'uso può aiutarci a consigliarti l'opzione migliore.

MikeSchinkel MikeSchinkel
26 feb 2011 22:53:23

Ho aggiornato sopra per rispondere alle tue domande.

Synetech Synetech
27 feb 2011 01:06:50

Presumo che il php sia nel template e non nel post, giusto?

Chris_O Chris_O
28 apr 2011 10:59:53

@Chris_O, quale template? Il tema? No, è nel post.

Synetech Synetech
28 apr 2011 21:26:16

Invece di aprire il file, leggerlo, ecc.. Usa semplicemente la funzione readfile. Legge un file e lo invia direttamente all'output. Una sola riga di codice. Vedi http://www.php.net/manual/en/function.readfile.php

Otto Otto
11 feb 2012 18:41:07
Tutte le risposte alla domanda 2
1

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

27 feb 2011 07:15:12
Commenti

Non ho familiarità con i transient; approfondirò l'argomento.

Synetech Synetech
28 mag 2011 16:19:17
0

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

http://codex.wordpress.org/Transients_API

28 mag 2011 14:05:23