Включение внешнего PHP файла в пользовательский шаблон WordPress

26 авг. 2013 г., 10:31:53
Просмотры: 88.4K
Голосов: 7

Возможно ли включить внешний 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('Нет комментариев &#187;', '1 комментарий &#187;', '% комментариев &#187;'); ?>
  </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'); ?>
4
Комментарии

Посмотрите http://codex.wordpress.org/Integrating_WordPress_with_Your_Website, это должно ответить на ваш вопрос.

Mark Davidson Mark Davidson
26 авг. 2013 г. 10:37:28

Вы можете использовать это. С какой именно проблемой вы столкнулись?

Vinod Dalvi Vinod Dalvi
26 авг. 2013 г. 10:39:35

Привет, я просто скопировал свои файлы в папку WordPress и правильно их связал.. В любом случае, какой ответ на этот вопрос? Я просто получаю пустую белую страницу

Jeremi Liwanag Jeremi Liwanag
26 авг. 2013 г. 17:07:19

Просто чтобы уточнить, вы пытаетесь подключить файлы, которые расположены на внешнем сайте? Если да, то разрешают ли текущие настройки прав доступа к файлам PHP на этом сайте публичное чтение этих файлов?

iyrin iyrin
13 февр. 2014 г. 16:08:13
Все ответы на вопрос 6
0

Нет, вы не можете подключать PHP-файлы в теме так, как вы указали.

Чтобы понять почему, достаточно применить немного здравого смысла и базовой критической оценки:

  1. Вы бы делали удаленный запрос к серверу, но include не может этого делать
  2. Если бы по какому-то чуду это сработало, у вас была бы серьезная уязвимость безопасности, так как можно было бы сделать что-то вроде: include( 'http://yoursite/wp-config.php' ); echo DB_PASSWORD;. Представьте, насколько легко было бы взламывать сайты! Что помешало бы мне подключить facebook.com/index.php?
  3. Даже если бы это каким-то образом сработало и было бы безопасно, представьте себе медлительность! Вы делаете запрос к серверу, а сервер затем делает еще один для заголовка, еще один для сайдбара, еще один для футера — все это ожидание, кому это нужно?
  4. Но самое главное: даже если бы 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 в футере вашего шаблона.
25 мар. 2014 г. 02:31:04
0

Предположим, у вас есть такой сценарий:

Ваша установка WordPress размещена в корневой папке 'www' как ваш сайт, а файл header.php находится в папке 'www/includes'.

В вашей теме WordPress просто добавьте:

<?php
include('includes/header.php');
?>

Когда WordPress читает файлы темы, он использует корневой путь.

13 февр. 2014 г. 13:37:39
1

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

Вы можете использовать:

file_get_contents('http://your.url'); 

или воспользоваться библиотекой Curl.

3 февр. 2014 г. 11:35:08
Комментарии

Пожалуйста, добавляйте подробные объяснения к своим ответам, чтобы помочь пользователю лучше понять вашу точку зрения.

Maruti Mohanty Maruti Mohanty
3 февр. 2014 г. 13:11:50
0

Для дочерней темы:

<?php echo get_stylesheet_directory_uri().'/subfoldername/add.php';?>

Можно использовать:

Для родительской темы: get_template_directory() или get_template_directory_uri()
Для дочерней темы: get_stylesheet_directory() или get_stylesheet_directory_uri()
24 апр. 2018 г. 16:04:10
0

Когда я проверил основные файлы, я обнаружил следующий код в файле 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 );
?>
12 янв. 2017 г. 10:16:29
0

Возможно, не совсем правильно отвечать на такой старый вопрос, но мне недавно пришлось решать похожую задачу, и я нашел этот результат, используя метод, который не был указан здесь. Записываю для будущих исследователей ;).

Мой случай использования:

  • 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'], но я это не исследовал.

5 мая 2020 г. 02:01:48