Я пытаюсь добавить страницу шаблона из плагина, и моя страница шаблона находится в этой папке плагина. Возможно ли это? Вот мой код:
global $user_ID;
$new_post = array(
'post_title' => 'Test Template Page',
'post_content' => 'Some text',
'post_status' => 'publish',
'post_date' => date('Y-m-d H:i:s'),
'post_author' => $user_ID,
'post_type' => 'page',
'post_category' => array(0)
);
$post_id = wp_insert_post($new_post);
if (!$post_id) {
wp_die('Error creating template page');
} else {
update_post_meta($post_id, '_wp_page_template', 'tp-file.php');
}
tp-file.php — моя пользовательская страница шаблона. Когда я помещаю этот файл в папку моей темы, он работает нормально, но я хочу сделать это с файлом из папки плагина, поэтому мне не нужно заставлять пользователей копировать это файл из папки плагина в папку шаблона. Возможно ли это? Любая идея?
unfocus.com/2010/08/10/… Кажется, решает эту проблему. Я не очень хорошо знаком с этим, поэтому я не могу сказать, работает ли он или нет.
Tnx @Rev.Voodoo посмотрит.
@Rev.Voodoo нет, это не помогло
каково содержание tp-file.php?
Tnx @ t31os Я пробовал, и это не сработало, чем я нашел этот adambrown.info/p/wp_hooks/hook/page_template, который устарел, есть другие идеи?
Я также пробовал что-то подобное, но это не сработало: $pt = get_page_templates(); $pt[‘Тестирование TP’] = WP_PLUGIN_URL. ‘/tp-test/tp-file.php’;
У меня это работает просто отлично…. мне нужно больше деталей, чем «это не сработало»..
Похоже, что файлы шаблонов не включены в подпапку, я обнаружил это в теме.php в функции get_page_templates, есть другие идеи?
Это не имеет значения, код, который я предоставил, будет работать нормально, если путь установлен правильно, а запрошенная страница
_wp_page_template
установлена наtp-file.php
… Я только что еще раз проверил его, чтобы убедиться, и снова подтвердил, что он работает (мне нужно см. больше вашего кода, если вы хотите, чтобы я помог вам понять, почему он не работает в вашей настройке).если
single_template
фильтр не сработал, вы можете использовать этот фильтр;add_filter('template_include', 'catch_plugin_template');
взято отсюда; pradipdebnath.com/2019/08/17/…Не уверен, что это устарело, просто изменилось с версии 4.7. developer.wordpress.org/reference/hooks/type_template/. Аргумент пуст, если темы не предоставляют шаблон, а не если страница выбрала (сохранила его) в базе данных из раскрывающегося списка выбора.
Связанная статья находится на правильном пути, но я сделаю ее более простой для вас.. 😉
Фильтр в основном смотрит, установлен ли ваш специальный шаблон страницы для текущей страницы, если это так, обновляет путь, чтобы вместо этого указать на ваш шаблон плагинов.
Просто убедитесь, что путь правильный, иначе вы увидите ошибки включения… 🙂
Продолжение №1
Хорошо, первая проблема заключается в том, что WordPress проверяет любой набор шаблонов как шаблон страницы, т.е. он проверяет, находится ли файл в папке темы и является ли он допустимым файлом шаблона, если нет, он пропускает его и включает более общий шаблон, например page.php…
Однако это не меняет того факта, что метаполе по-прежнему содержит значение вашего пользовательского шаблона, а также
is_page_template( 'tp-file.php' )
будет правильно возвращать значение true, если оно используется вместо моего предыдущего условного оператора, например..ПРИМЕЧАНИЕ. Я переключил код на использование
WP_PLUGIN_DIR
, посколькуWP_PLUGIN_URL
константа не подходит для путей… (включает в себя должен использовать путь, а не URL-адрес).Одна проблема, и это действительно не то, что вы можете исправить, заключается в том, что при просмотре страницы из области администратора при редактировании страницы шаблон не будет указан как активный шаблон, и сохранение изменений, конечно, может изменить активный шаблон. Там мы можем многое сделать, раскрывающийся список шаблонов страниц генерируется из функции, которая сканирует файлы темы, я не вижу никаких хуков, которые позволили бы нам расширить список с помощью шаблонов плагинов.
Лично я бы предложил в качестве обходного пути сохранить дополнительное метаполе на каждой странице, созданной с использованием вашей специальной страницы плагина, затем добавить крючок
save_post
илиwp_insert_post_data
и проверить, существует ли это метаполе, если оно существует, также проверьте, что для шаблона страницы задано значениеtp-file.php
, а если нет, обновите его доtp-file.php
. Дополнительное мета-поле будет, так сказать, просто флагом, указывающим, к каким страницам необходимо прикрепить шаблон вашего плагина.Вот ваш плагин работает в самой простой форме (да, я проверял)… 🙂
Надеюсь, это поможет прояснить ситуацию.. 🙂
Сейчас
page_template
фильтр устарел. ( http://adambrown.info/p/wp_hooks/hook/page_template )Попробуйте вместо этого использовать
single_template
(илиarchive_template
для архивных шаблонов).На основе ответа @ t31os: