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

29

пытаясь вставить контент перед публикацией контента в моем functions.php - я знаю, как использовать обычные wp-хуки, но не знаю, как вставить в другие области.

Пробовал это, но это убивает контент на любой другой тип сообщения:

function property_slideshow( $content ) {
 if ( is_single() && 'property' == get_post_type() ) {
    $custom_content = '[portfolio_slideshow]';
    $custom_content .= $content;
    return $custom_content;
    } 
}
add_filter( 'the_content', 'property_slideshow' );

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

Джейсон
источник

Ответы:

39

Просто используйте the_contentфильтр, например:

<?php
function theme_slug_filter_the_content( $content ) {
    $custom_content = 'YOUR CONTENT GOES HERE';
    $custom_content .= $content;
    return $custom_content;
}
add_filter( 'the_content', 'theme_slug_filter_the_content' );
?>

По сути, вы добавляете контент публикации после вашего пользовательского контента, а затем возвращаете результат.

редактировать

Как отмечает Фрэнки @bueltge в своем комментарии, этот процесс одинаков для заголовка поста; просто добавьте фильтр на the_titleкрючок:

<?php
function theme_slug_filter_the_title( $title ) {
    $custom_title = 'YOUR CONTENT GOES HERE';
    $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() ) {}но это не сработало для меня
Джейсон
@ChipBennett - у меня получилось, что он работает с моим пользовательским типом записи, но контент исчезает из любого другого типа записи. Смотрите редактирование выше.
Джейсон
1
Это связано с тем, что вы не возвращаетесь $contentдля других типов сообщений, а не для своего пользовательского типа. Смотрите обновленный ответ.
Чип Беннетт
Просто примечание - вам не нужен блок else {} - только резервный возврат. Если условие выполнено, возврат в if () выводит вас из функции, если вы сделаете это после if (), тогда обратный возврат будет выполнен.
phatskat
0
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 который в данном случае является собственностью.

Кроме того, вы можете посмотреть на do_shortcode

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