it-swarm.com.de

Einfügen einer externen Datei in einen Beitrag (und Verwenden von verarbeiteten Pfaden)

Ich habe einen Beitrag, der eine relativ große Tabelle enthält, die häufig aktualisiert wird. Anstatt die (langsamere) Weboberfläche zu verwenden, um den Beitrag jedes Mal zu aktualisieren, installierte ich eines der "PHP ausführen" -Plugins und fügte ein kurzes Stück PHP Code in den Tabellenkörper ein, der eine externe Datei öffnet der Server und setzt das in die Tabelle in der Post. Auf diese Weise kann ich die Datei nach Bedarf lokal in einem ansprechenden Texteditor bearbeiten und die Änderung wird sofort wirksam, wenn die Seite bereitgestellt wird (und ohne dass Änderungen an einer der WordPress-Tabellen erforderlich sind).

Dies funktioniert ziemlich gut und ich bin im Allgemeinen zufrieden damit, aber es gibt einen kleinen Haken darin, dass der Pfad zur externen Textdatei relativ zum Speicher auf dem Server ist (ich habe den Medienbibliotheks-Manager verwendet, um ihn zu speichern, und weil Ich verwende die Multi-Site-Funktion und PHP ist serverseitig, der Pfad hat die Form "wp-content/blogs.dir/1/files/2011/02/foobar.txt"). Die Pfade zu anderen Dateien wie Bildern, die clientseitiger Code wie JavaScript verwendet, sind relativ zur URL. Dies ist offensichtlich aus mehreren Gründen nicht ideal.

Ich habe also zwei Fragen:

  1. Gibt es eine bessere Möglichkeit, externen Inhalt in einen Beitrag aufzunehmen, als PHP zu verwenden?
  2. (Nun, 1b.) Wenn nicht, gibt es eine bessere - dh konsistentere - Möglichkeit, auf die Dateien zuzugreifen? (Das heißt, eine Möglichkeit, PHP URL-relative Pfade anstelle von server-relativen Pfaden zu verwenden?)



Erläuterung:

In der Post habe ich etwas in der Art (Code ist überragend, ignorieren Sie also alle Fehler):

…
  <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; TXT file is not updated *that* often
       print($data);
       fclose($fh);
      ?>
    <tbody>
  </table>
…

Wo die Textdatei so etwas enthält:

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

Wenn die Seite geliefert wird, wird das PHP im Beitrag ausgeführt und zieht die Tabellenzeilen aus der externen Datei. Dabei werden alle Änderungen übernommen, die ich extern an der Seite vorgenommen habe, ohne dass dazu WordPress verwendet werden muss.

Vor der Tabelle, in der Bilder behandelt werden, befindet sich auch ein JavaScript, das einige Bilder gemäß einer switch-Anweisung festlegt (die Bilder wurden mit der Medienbibliothek importiert).

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;
…
2
Synetech

1) Ja, es gibt bessere Möglichkeiten ... eine wäre, einen Shortcode zu verwenden, anstatt PHP in Ihrer Datenbank zu speichern. Schreiben und registrieren Sie einen Shortcode-Rückruf, der Ihre Datei liest und den Inhalt zurückgibt, und ersetzen Sie Ihren Abschnitt <?php ... ?> im Beitrag durch den Shortcode. Sie können die Datei auch mit file_get_contents(); lesen, wodurch Sie einige Codezeilen sparen.

2) Sie könnten eine Funktion schreiben, die dies simuliert, aber der Nutzen wäre zu gering, um den Aufwand zu rechtfertigen.

ABER: Anstatt Ihren Dateipfad fest in den Shortcode zu codieren, können Sie seinen Pfad über get_attached_file($attachment_id) abrufen.

1
wyrfel

Wie oft wird diese Datei aktualisiert? Warum ziehen Sie nicht die Daten und speichern Sie sie in einem zeitlich begrenzten Zeitraum? Auf diese Weise verarbeiten Sie beim Servieren nichts und werden auch zwischengespeichert. (und dein url Problem ist wahrscheinlich auch behoben).

In der Regel vergleichen Sie den gespeicherten Übergangswert auch mit den neuesten Daten und aktualisieren ihn nur, wenn eine Änderung vorliegt (mit md5 oder md5_file).

http://codex.wordpress.org/Transients_API

1
Wyck