Включение внешнего файла в запись (с использованием обработанных путей)
У меня есть запись, содержащая довольно большую таблицу, которая часто обновляется. Вместо использования (медленного) веб-интерфейса WordPress для обновления записи каждый раз, я установил один из плагинов "выполнения PHP" и добавил небольшой PHP-код в тело таблицы, который открывает внешний файл на сервере и вставляет его содержимое в таблицу в записи. Таким образом, я могу редактировать файл локально в удобном текстовом редакторе, и изменения сразу же отображаются при загрузке страницы (без необходимости изменять таблицы WordPress).
Это работает довольно хорошо, и в целом я доволен решением, но есть небольшой нюанс: путь к внешнему текстовому файлу задан относительно хранилища на сервере (я использовал медиабиблиотеку для его хранения, и поскольку я использую функцию мультисайта, а PHP работает на стороне сервера, путь имеет вид "wp-content/blogs.dir/1/files/2011/02/foobar.txt"
). Пути к другим файлам, таким как изображения, которые использует клиентский код (например, JavaScript), заданы относительно URL. Это очевидно неидеально по нескольким причинам.
Поэтому у меня два вопроса:
- Есть ли способ лучше для включения внешнего контента в запись, чем использование PHP?
- (или 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;
…

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

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