WordPress хуки/фильтры: вставка контента перед содержимым или после заголовка
Пытаюсь вставить контент перед содержимым поста в файле functions.php. Я знаю, как использовать стандартные хуки WordPress, но не уверен, как вставлять контент в другие области.
Попробовал этот вариант, но он удаляет содержимое для других типов записей:
function property_slideshow( $content ) {
// Проверяем, что это одиночная запись типа 'property'
if ( is_single() && 'property' == get_post_type() ) {
$custom_content = '[portfolio_slideshow]';
$custom_content .= $content;
return $custom_content;
}
}
// Добавляем фильтр к содержимому
add_filter( 'the_content', 'property_slideshow' );
Как сделать это условным?
Просто используйте фильтр the_content
, например:
<?php
function theme_slug_filter_the_content( $content ) {
$custom_content = 'ВАШ КОНТЕНТ ЗДЕСЬ';
$custom_content .= $content;
return $custom_content;
}
add_filter( 'the_content', 'theme_slug_filter_the_content' );
?>
По сути, вы добавляете содержимое записи после вашего кастомного контента, а затем возвращаете результат.
Редактирование
Как отмечает Franky @bueltge в своём комментарии, процесс аналогичен для заголовка записи; просто добавьте фильтр к хуку the_title
:
<?php
function theme_slug_filter_the_title( $title ) {
$custom_title = 'ВАШ КОНТЕНТ ЗДЕСЬ';
$title .= $custom_title;
return $title;
}
add_filter( 'the_title', 'theme_slug_filter_the_title' );
?>
Обратите внимание, что в этом случае вы добавляете кастомный контент после заголовка. (Это не принципиально; я просто следовал тому, что указано в вашем вопросе.)
Редактирование 2
Причина, по которой ваш пример кода не работает, заключается в том, что вы возвращаете $content
только при выполнении условия. Вам нужно возвращать $content
без изменений в блоке else
вашего условия. Например:
function property_slideshow( $content ) {
if ( is_single() && 'property' == get_post_type() ) {
$custom_content = '[portfolio_slideshow]';
$custom_content .= $content;
return $custom_content;
} else {
return $content;
}
}
add_filter( 'the_content', 'property_slideshow' );
Таким образом, для записей не типа 'property' будет возвращён неизменённый $content
.

также можно добавить контент после заголовка; фильтр the_title — это правильный хук.

@ChipBennett вопрос — как сделать это с логикой только для пользовательского типа записи — я попытался обернуть это в if ( is_single() && 'property' == get_post_type() ) {}
, но у меня не сработало

@ChipBennett — у меня получилось сделать это для моего пользовательского типа записи, но контент исчезает из всех других типов записей. Смотрите изменения выше.

Это происходит потому, что вы не возвращаете $content
для типов записей, отличных от вашего пользовательского типа записи. Смотрите обновлённый ответ.

Просто заметка — вам не нужен блок else { } — достаточно резервного возврата. Если условие выполняется, return в if() выводит вас из функции, а если вы проходите мимо if(), то сработает резервный return.

Верно, return $content;
можно вынести из условного оператора if/else
. Я оставил его там в основном для наглядности логики, объясняющей что, как и почему возвращается.

вы можете указать третий аргумент для приоритета в функции add_filter.

В версии 5.2 был представлен новый хук, который срабатывает сразу после открывающего тега <body>
. Больше не нужно возиться с содержимым записи.
/**
* Добавляет фрагменты кода сразу после открывающего тега <body>
*/
function add_to_top_of_body() {
echo '<!-- Google Tag Manager (noscript) --><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-YOURMOM" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><!-- End Google Tag Manager (noscript) -->';
}
add_action( 'wp_body_open', 'add_to_top_of_body' );

function property_slideshow( $content ) {
if ( is_singular( 'property' ) ) {
$custom_content = do_shortcode( '[portfolio_slideshow]' );
$custom_content .= $content;
}
return $custom_content;
}
add_filter( 'the_content', 'property_slideshow' );
Условный тег is_singular
проверяет, отображается ли отдельная запись, и позволяет указать параметр $post_types, который в данном случае равен 'property'.
Также вам может быть полезно ознакомиться с функцией do_shortcode

Опоздал к обсуждению, но вы возвращаете пустую переменную в случае, если is_singular( 'property' ) возвращает false. Если инвертировать логику в этом месте и просто возвращать $content в таком случае, код станет чище и более читаемым.
