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 — это правильный хук.
bueltge
@ChipBennett вопрос — как сделать это с логикой только для пользовательского типа записи — я попытался обернуть это в if ( is_single() && 'property' == get_post_type() ) {}, но у меня не сработало
Jason
@ChipBennett — у меня получилось сделать это для моего пользовательского типа записи, но контент исчезает из всех других типов записей. Смотрите изменения выше.
Jason
Это происходит потому, что вы не возвращаете $content для типов записей, отличных от вашего пользовательского типа записи. Смотрите обновлённый ответ.
Chip Bennett
Просто заметка — вам не нужен блок else { } — достаточно резервного возврата. Если условие выполняется, return в if() выводит вас из функции, а если вы проходите мимо if(), то сработает резервный return.
phatskat
Верно, return $content; можно вынести из условного оператора if/else. Я оставил его там в основном для наглядности логики, объясняющей что, как и почему возвращается.
Chip Bennett
вы можете указать третий аргумент для приоритета в функции add_filter.
Andrew Welch
В версии 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 в таком случае, код станет чище и более читаемым.
Travis Weston