Вставка динамического контента на страницу
Я вижу, что эта тема поднимается регулярно, но пока не нашел ответа на свой конкретный запрос.
Я пытаюсь использовать страницу WordPress как шаблон и вставлять контент из базы данных (около 20 текстовых полей, включая имена файлов изображений) на основе ID, переданного в качестве параметра URL (и индекса моей базы данных). Например: www.example.com/examplepage/?pid=123
До WordPress я мог легко сделать это на PHP, выполнив код для получения записи из базы данных, а затем вывести HTML с этими полями.
У меня есть плагин в WordPress, который позволяет выполнять PHP-код на странице, но это происходит в теле страницы, и я полагаю, что заголовок к этому моменту уже выведен. В заголовке есть поля, такие как title и meta desc, которые я хотел бы заполнять динамическим контентом.
Я видел плагины для CMS-подобного управления списками недвижимости, фильмов и т.д., но работа с моей базой данных немного необычна, поэтому мне нужно использовать индивидуальный подход.
Я понимаю, что может потребоваться внести изменения в файл functions.php моей темы, чтобы углубиться в процесс рендеринга страниц WordPress, но я хочу быть осторожным, чтобы не нарушить работу остальных страниц/постов на моем сайте. Это должна быть всего одна специальная страница, которая будет принимать параметры и загружать соответствующий контент.
Буду признателен за советы о необходимых шагах.

При создании шаблона страницы вы можете вставлять в его содержимое что угодно и использовать любые PHP-фрагменты. Таким образом, вы можете продолжать работать так же, как и в обычном PHP. Например, ваш шаблон страницы может выглядеть так:
<?php
/*
Template Name: Мой шаблон
*/
get_header();
?>
<main>
<?php
if( isset( $_GET['pid'] ) ) {
// Добавьте ваш динамический контент здесь
}
?>
</main>
<?php get_footer(); ?>
Вы правы насчёт заголовка и мета-тегов документа — они могут быть уже установлены. В этом случае вам нужно использовать фильтр wp_title
и действие wp_head
, а также функцию is_page_template
для проверки, используется ли шаблон страницы.
Например, предположим, что ваш файл шаблона называется page-mytemplate.php
и находится в корневой папке вашей темы:
add_filter( 'wp_title', function( $title, $sep ) {
if( is_page_template( 'page-mytemplate.php' ) ) {
// Измените $title здесь
$title = 'Мой новый заголовок';
}
return $title;
}, 10, 2 );
add_action( 'wp_head', function() {
if( is_page_template( 'page-mytemplate.php' ) ) {
// Добавьте/выведите ваши мета-теги здесь
echo '<meta name=....>';
}
} );
Проблема
Существует серьёзная проблема с мета-тегами. В WordPress нет стандартного способа управления мета-тегами документа. Если вы используете плагин, который добавляет мета-теги, вы не сможете их переопределить, если только плагин не предоставляет такую возможность.
Ссылки

Спасибо за это. Я нашел информацию о шаблонах страниц WordPress и попробую это. Что касается ваших заметок о тегах <meta>, подозреваю, что мой плагин Yoast может помешать. Я бы поставил Vote++, но я новичок и пока не имею права голосовать!

Извините, но я вас не понимаю. Вы сказали, что используете шаблон страницы, поэтому я предположил, что вы знаете, как его создать; я не понимаю, что вы сейчас говорите о ссылке на шаблоны страниц. Думаю, я ответил именно на ваш вопрос, поэтому считаю, что мой ответ должен быть помечен как принятый; если нет, пожалуйста, объясните, почему этот ответ не решает вашу проблему. Кстати: вашей текущей репутации достаточно для принятия ответов.

Возможно, я вас неправильно понял. Вы сказали "используйте страницу WordPress как шаблон", и я подумал, что вы имеете в виду шаблоны страниц WordPress; поэтому я начал ответ со слов "Так как вы создаете шаблон страницы".

Извините... я новичок на StackExchange и предположил, что голосование — это знак одобрения. Теперь я нашёл галочку/отметку. Вы правы, что я использовал слово "шаблон" в общем смысле в своём вопросе, но теперь я понимаю, что лучший путь для меня — использовать "Специализированный шаблон страницы" в WordPress, который работает для конкретной страницы. Я легко могу встроить свою работу с базой данных PHP туда. Было бы удобно сохранить дизайн макета на странице и вставить поля из базы данных... Подозреваю, что шорткоды могут быть здесь полезны? Ещё раз спасибо за развёрнутый ответ.

Поскольку шаблон страницы — это PHP-файл, вы можете строить его как угодно. С шорткодами или без них. Используйте шорткоды, если хотите выводить информацию где-то ещё, а не только в шаблоне страницы. То есть вы можете использовать PHP-функцию в шаблоне страницы и ту же функцию в качестве callback для шорткода; но шорткоды вообще не обязательны для шаблона страницы. Здесь вы можете увидеть, что шорткод — это просто placeholder для PHP-функции и как их можно использовать отдельно.

Спасибо, cybmeta. У меня получилось настроить пользовательский шаблон, и я решил реализовать макет страницы в самой странице. Шорткоды оказались удобным способом настройки полей из базы данных/расчётных полей и их размещения в контенте страницы. Единственная проблема — установка заголовка страницы и мета-описания с помощью add_filter(). Я использую Genesis и подозреваю, что SEO-элементы мешают. Я задам об этом вопрос в другом посте.

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

Возможно, я что-то упускаю, но:
Если вам нужен только 'pid', например, и он является частью URL, то это довольно просто?
В шаблоне страницы 'examplepage' просто сделайте:
$mypid = $_GET['pid'];
а затем продолжите SQL-запрос на основе этого значения и выведите ответ.
Если вам нужно что-то более AJAX-ориентированное, то когда пользователь заходит на 'examplepage', возьмите 'pid' и добавьте его как класс или data-атрибут в пустой div. Например, назовите его 'results-container':
<?php $mypid = $_GET['pid']; ?>
<div class"results-container" mypid="<?php echo $mypid; ?>"></div>
Затем добавьте JS-скрипт, который выполняется при готовности документа, читает атрибут mypid этого div и выполняет отдельный fetch. Таким образом, страница может загрузиться и показать статус "загрузки" и предварительный контент, пока результаты подгружаются.
Надеюсь, это понятно.
- Написано толстыми пальцами на мобильном телефоне! Аааа.

Я сам недавно делал это. Возможно, мой ответ запоздал, но если кто-то еще захочет узнать как, вот шаги, которые я выполнил в среде WordPress:
Создайте функцию, которая читает параметр URL, например:
function details_Page($atts) { global $wpdb; // Получаем запись из базы данных для этой детальной страницы $DatabaseId = $_GET['pid']; if(!is_numeric ($DatabaseId)) { // ПЕРЕХОД НА СТРАНИЦУ "СТРАНИЦА НЕ НАЙДЕНА", ЕСЛИ ID НЕВАЛИДНЫЙ header('Location: /missing-page/'); return; } ГЕНЕРИРУЙТЕ ВАШ КОД СТРАНИЦЫ ЗДЕСЬ }
Теперь создайте шорткод для этой функции или используйте ее в шаблоне страницы. По сути, это еще один способ создания шаблона страницы.
add_shortcode('DETAILS_PAGE', 'details_Page');
Теперь добавьте шорткод на специально созданную страницу (или в шаблон).
Чтобы изменить заголовок в соответствии с вашими данными, убедитесь, что вызов add_action находится в основном цикле или в functions.php. Иначе может возникнуть состояние гонки.
add_action( 'wp_head', 'MMD_listings_add_custom_meta', 10 );
function add_custom_meta()
{
$slug = basename(get_permalink()); // Я использую для конкретной страницы
if( $slug == 'details')
{
$Name = $_GET[ 'Name' ];
$Desc = $_GET[ 'Desc' ];
$Logo = $_GET[ 'Logo' ];
?>
<meta content="<?php echo $Name; ?>>"/>
<meta content="<?php echo $Desc; ?>">
<?PHP
}
}
