Включение внешнего файла в запись (с использованием обработанных путей)

26 февр. 2011 г., 19:41:58
Просмотры: 1.08K
Голосов: 2

У меня есть запись, содержащая довольно большую таблицу, которая часто обновляется. Вместо использования (медленного) веб-интерфейса WordPress для обновления записи каждый раз, я установил один из плагинов "выполнения PHP" и добавил небольшой PHP-код в тело таблицы, который открывает внешний файл на сервере и вставляет его содержимое в таблицу в записи. Таким образом, я могу редактировать файл локально в удобном текстовом редакторе, и изменения сразу же отображаются при загрузке страницы (без необходимости изменять таблицы WordPress).

Это работает довольно хорошо, и в целом я доволен решением, но есть небольшой нюанс: путь к внешнему текстовому файлу задан относительно хранилища на сервере (я использовал медиабиблиотеку для его хранения, и поскольку я использую функцию мультисайта, а PHP работает на стороне сервера, путь имеет вид "wp-content/blogs.dir/1/files/2011/02/foobar.txt"). Пути к другим файлам, таким как изображения, которые использует клиентский код (например, JavaScript), заданы относительно URL. Это очевидно неидеально по нескольким причинам.

Поэтому у меня два вопроса:

  1. Есть ли способ лучше для включения внешнего контента в запись, чем использование PHP?
  2. (или 1б.) Если нет, есть ли лучший — то есть более согласованный — способ доступа к файлам? (То есть способ заставить PHP использовать пути относительно URL вместо путей относительно сервера?)



Уточнение:

В записи у меня примерно такой код (написан по памяти, возможны ошибки):

<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)); //нет clearstatcache; TXT файл обновляется не *так* часто
       print($data);
       fclose($fh);
      ?>
    <tbody>
  </table>

Где текстовый файл содержит что-то вроде:

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

При загрузке страницы PHP в записи выполняется и вставляет строки таблицы из внешнего файла, подхватывая любые изменения, которые я сделал во внешнем файле, без необходимости проходить через WordPress.

Также перед таблицей есть JavaScript, который устанавливает некоторые изображения в зависимости от условия — изображения были импортированы через медиабиблиотеку — что-то вроде:

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
Комментарии

Какого рода данные вы храните? Как они отображаются; в теле страницы? Сайт в интернете, и если да, то каков URL веб-страницы, где они хранятся? Где вы используете "запуск PHP"; в виджете? Понимание вашего сценария использования поможет нам порекомендовать оптимальное решение.

MikeSchinkel MikeSchinkel
26 февр. 2011 г. 22:53:23

Я обновил выше, чтобы ответить на ваши вопросы.

Synetech Synetech
27 февр. 2011 г. 01:06:50

Я предполагаю, что php находится в шаблоне, а не в посте, верно?

Chris_O Chris_O
28 апр. 2011 г. 10:59:53

@Chris_O, какой шаблон? Тему? Нет, это в посте.

Synetech Synetech
28 апр. 2011 г. 21:26:16

Вместо того чтобы открывать файл, читать его и т.д.. Просто используйте функцию readfile. Она читает файл и сразу выводит его содержимое. Всего одна строка кода. Смотрите http://www.php.net/manual/en/function.readfile.php

Otto Otto
11 февр. 2012 г. 18:41:07
Все ответы на вопрос 2
1

1) Да, есть лучшие способы... один из них — использовать шорткод вместо хранения php в вашей базе данных. Напишите и зарегистрируйте callback-функцию для шорткода, которая читает ваш файл и возвращает его содержимое, а затем замените секцию <?php ... ?> в записи на этот шорткод. Также вы можете прочитать файл с помощью file_get_contents();, что позволит сократить несколько строк кода.

2) Вы могли бы написать функцию, которая имитирует это, но выгода будет слишком незначительной, чтобы оправдать усилия.

НО: Вместо того, чтобы жестко прописывать путь к файлу в шорткоде, вы можете получить его через get_attached_file($attachment_id).

27 февр. 2011 г. 07:15:12
Комментарии

Я не знаком с transient'ами; я изучу этот вопрос.

Synetech Synetech
28 мая 2011 г. 16:19:17
0

Как часто обновляется этот файл? Почему бы не получить данные и не сохранить их в транзиенте с ограничением по времени. Таким образом, при запросе не будет выполняться никакой обработки, и данные также будут кэшированы (и ваша проблема с URL, скорее всего, тоже решится).

Обычно также сравнивают сохранённое значение транзиента с самыми свежими данными и обновляют его только в случае изменений (используя md5 или md5_file).

http://codex.wordpress.org/Transients_API

28 мая 2011 г. 14:05:23