Включение внешнего PHP файла в пользовательский шаблон WordPress
Возможно ли включить внешний PHP файл в пользовательский шаблон?
Я пытаюсь добавить блог на свой сайт. У меня уже есть макет шапки, подвала и боковой панели на моем сайте. Могу ли я использовать их в своем пользовательском шаблоне?
<?php
/*
Template Name: Blog
*/
?>
<?php include( PATH . 'http://www.example.com/includes/header.php' ); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div <?php post_class() ?> id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink() ?>">
<?php the_title(); ?>
</a></h2>
<?php include (TEMPLATEPATH . '/inc/meta.php' ); ?>
<div class="entry">
<?php the_content(); ?>
</div>
<div class="postmetadata">
<?php the_tags('Теги: ', ', ', '<br />'); ?>
Опубликовано в
<?php the_category(', ') ?>
|
<?php comments_popup_link('Нет комментариев »', '1 комментарий »', '% комментариев »'); ?>
</div>
</div>
<?php endwhile; ?>
<div class="mypagination">
<?php include (TEMPLATEPATH . '/inc/nav.php' ); ?>
</div>
<?php else : ?>
<h2>Не найдено</h2>
<?php endif; ?>
<?php include( PATH . 'http://www.example.com/includes/sidebar.php' ); ?>
<?php include( PATH . 'http://www.example.com/includes/footer.php' ); ?>
Я также пробовал:
<?php include('http://mywebsite.com/includes/header.php'); ?>

Нет, вы не можете подключать PHP-файлы в теме так, как вы указали.
Чтобы понять почему, достаточно применить немного здравого смысла и базовой критической оценки:
- Вы бы делали удаленный запрос к серверу, но
include
не может этого делать - Если бы по какому-то чуду это сработало, у вас была бы серьезная уязвимость безопасности, так как можно было бы сделать что-то вроде:
include( 'http://yoursite/wp-config.php' ); echo DB_PASSWORD;
. Представьте, насколько легко было бы взламывать сайты! Что помешало бы мне подключитьfacebook.com/index.php
? - Даже если бы это каким-то образом сработало и было бы безопасно, представьте себе медлительность! Вы делаете запрос к серверу, а сервер затем делает еще один для заголовка, еще один для сайдбара, еще один для футера — все это ожидание, кому это нужно?
- Но самое главное: даже если бы
include
мог делать удаленные запросы (чего он не может), почему он возвращал бы PHP-код? Разве он не вернул бы то, что выдает сервер, то есть готовый HTML? Сервер выполняет PHP перед тем, как вернуть ответ, поэтому в подключаемом содержимом не было бы PHP.
Так что нет, это невозможно. Но быстрая копия-вставка кода из вашего вопроса в PHP-скрипт с последующим быстрым посещением страницы показала бы вам это быстрее, чем кто-либо здесь.
Вместо этого вы можете подключать только файлы из локальной файловой системы, на которой работает ваш сервер. Вы никогда не должны передавать URL в include
или require
.
Например, если я нахожусь в index.php
, а в той же папке есть файл sidebar.php
, я подключу его так:
include('sidebar.php');
include
возвращает значение, если подключение не удалось. Семантика оператора include
— это базовая часть PHP и не относится к тематике этого Q&A сайта.
Однако я оставил этот вопрос открытым, потому что в WordPress есть API-функция, которую вам стоит использовать вместо include
и require
для ваших нужд.
Чтобы подключить часть шаблона в теме, используйте:
get_template_part( 'partname' );
Эта функция также будет искать указанную часть в дочерней или родительской теме.
Например, в этом коде:
get_template_part( 'sidebar', 'first' );
Она будет искать и подключать первый найденный из следующих файлов:
- дочерняя тема
sidebar-first.php
- родительская тема
sidebar-first.php
- дочерняя тема
sidebar.php
- родительская тема
sidebar.php
Стоит отметить, что get_template_part
следует использовать только для подключения файлов шаблонов. Не используйте его для подключения библиотек или других PHP-файлов, которые не выводят HTML.
Я рекомендую вам изучить следующие темы, прежде чем продолжить:
- функции
include
иrequire
на PHP.Net - родительские и дочерние темы
- иерархию шаблонов и то, как WordPress выбирает, какой шаблон использовать
<?php php ?> <?php tag ?> <?php spam ?> <?php and ?> <?php why ?> <?php its ?> <?php bad ?>
get_template_part
- API
WP_HTTP
для тех случаев, когда действительно нужно делать удаленные запросы к API. Здесь помогут функцииwp_remote_get
иwp_remote_post
. - Отладка PHP. Ваши белые страницы — это фатальные ошибки PHP, но поскольку у вас включено скрытие ошибок, они записываются в лог-файл, о котором вы не знаете. Найдите свой лог ошибок, определите
WP_DEBUG
вwp-config.php
и установите плагин, например, Debug Bar или Query Monitor — это вам очень поможет. Убедитесь, что вы вызываетеwp_footer
в футере вашего шаблона.

Предположим, у вас есть такой сценарий:
Ваша установка WordPress размещена в корневой папке 'www' как ваш сайт, а файл header.php находится в папке 'www/includes'.
В вашей теме WordPress просто добавьте:
<?php
include('includes/header.php');
?>
Когда WordPress читает файлы темы, он использует корневой путь.

Вы не можете подключать внешние ресурсы с помощью функций include()
! Функция include работает с внутренними путями сервера. Вы не можете включать URL, как вам захочется. Это проблема безопасности PHP!
Вы можете использовать:
file_get_contents('http://your.url');
или воспользоваться библиотекой Curl.

Для дочерней темы:
<?php echo get_stylesheet_directory_uri().'/subfoldername/add.php';?>
Можно использовать:
Для родительской темы: get_template_directory() или get_template_directory_uri()
Для дочерней темы: get_stylesheet_directory() или get_stylesheet_directory_uri()

Когда я проверил основные файлы, я обнаружил следующий код в файле wp/wp-includes/general-template.php
для функции get_header()
Я нашел следующие строки:
$templates[] = 'header.php';
locate_template( $templates, true );
Поэтому я использую это в своем коде (index.php
) следующим образом:
<?php get_header();
$myphpfile[] = 'grid.php';
locate_template( $myphpfile, true );
?>

Возможно, не совсем правильно отвечать на такой старый вопрос, но мне недавно пришлось решать похожую задачу, и я нашел этот результат, используя метод, который не был указан здесь. Записываю для будущих исследователей ;).
Мой случай использования:
- Wordpress установлен в поддиректории
- Я хотел включать элементы футера/хедера из родительского сайта, а не использовать Wordpress для этих элементов
Поскольку include()
или require()
могут использовать абсолютные пути сервера (например: /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
), мы можем использовать определение ABSPATH
в Wordpress для генерации этого пути:
include( dirname( ABSPATH ) . '/includes/header.php' );
Это вернет /var/www/vhosts/foo.bar/httpdocs/includes/baz.php
.
Даже если Wordpress находится в поддиректории (например: /var/www/vhosts/foo.bar/httpdocs/blog/
), dirname( ABSPATH )
даст нам корневую директорию документа в любом случае.
Возможно, есть другие способы сделать это, например, используя суперглобальную переменную $_SERVER['DOCUMENT_ROOT']
, но я это не исследовал.
