WordPress хуки/фильтры: вставка контента перед содержимым или после заголовка

24 янв. 2012 г., 05:49:27
Просмотры: 93.5K
Голосов: 35

Пытаюсь вставить контент перед содержимым поста в файле 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' );

Как сделать это условным?

1
Комментарии

В данном случае: просто убедитесь, что ваша функция в любом случае возвращает $content (если он не был изменен).

Bigue Nique Bigue Nique
30 апр. 2020 г. 09:29:51
Все ответы на вопрос 3
8
49

Просто используйте фильтр 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.

24 янв. 2012 г. 05:59:13
Комментарии

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

bueltge bueltge
24 янв. 2012 г. 09:51:17

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

Jason Jason
25 янв. 2012 г. 02:02:05

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

Jason Jason
25 янв. 2012 г. 02:10:19

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

Chip Bennett Chip Bennett
25 янв. 2012 г. 02:55:41

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

phatskat phatskat
6 дек. 2012 г. 17:02:58

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

Chip Bennett Chip Bennett
6 дек. 2012 г. 17:08:53

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

Andrew Welch Andrew Welch
10 июн. 2016 г. 00:11:02

Спасибо за хук Edit 2. После небольшой доработки удалось вывести шорткод после контента. Старый пост, но работает на данный момент в WP 5.4. !!!

Rodrigo Zuluaga Rodrigo Zuluaga
10 июл. 2020 г. 02:54:54
Показать остальные 3 комментариев
0

В версии 5.2 был представлен новый хук, который срабатывает сразу после открывающего тега <body>. Больше не нужно возиться с содержимым записи.

wp_open_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' );
31 мар. 2022 г. 17:22:11
2
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

2 нояб. 2014 г. 21:29:26
Комментарии

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

Travis Weston Travis Weston
13 сент. 2018 г. 16:50:54

Также можно добавить else или использовать тернарный оператор. Это быстрый пример, не полностью протестированный, который можно расширить.

Brad Dalton Brad Dalton
13 сент. 2018 г. 20:09:01