Проблема возвращает функцию внутри шорткода в Wordpress
Эй, ребята, у меня возникли некоторые проблемы с кодированием шорткода темы. Я хочу, чтобы код отображал div с функцией счетчика просмотров, а затем ссылку с содержимым shotcodes в качестве URL-адреса.
Функция view_count(); отлично работает при вызове внутри файлов темы, и мне действительно удалось ее отобразить, но затем она отобразилась перед the_content(); сообщения (серая полоса), когда я хотел, чтобы она была в содержимом под элементом.
(1) Вот что у меня есть:
function video_block( $atts, $content = null ) {
return '<div class="video-block"><span class="ViewCount"><?php the_views(); ?></span> <a class="dl-source" href="' . $content . '">Link</a></div>';
}
(2) Вот код, который отображает оба в верхней части страницы:
function video_block( $atts, $content = null ) { ?>
<div class="video-block"><span class="ViewCount"><?php the_views(); ?></span> <a class="dl-source" href="<?php echo $content; ?>">Link</a></div>
<?php }
(3) В этом коде отображаются представления, указанные выше, и ссылка в правильном месте:
function video_block( $atts, $content = null ) {
$views = the_views();
return '<div class="video-block"><span class="ViewCount"><?php $views; ?></span> <a class="dl-source" href="<?php echo $content; ?>">Link</a></div>';
}
Я где-то читал на форумах Wordpress, что вы должны возвращать (вместо echo) значения в функциях, но это нарушает его, отображая количество просмотров, пропускает html и выплевывает содержимое $.
Вот ссылка на рассматриваемую страницу: http://nvrt.me/4Qf1 (в настоящее время используется код из блока #2)
У меня заканчивается полуночное масло. Я был бы очень признателен, если бы кто-нибудь мог мне помочь.
РЕДАКТИРОВАТЬ:
Вот код для функции the_views();. Я вижу, что он повторяется, но при изменении на возврат он вообще не отображается.
### Function: Display The Post Views
function the_views($display = true, $prefix = '', $postfix = '', $always = false) {
$post_views = intval(post_custom('views'));
$views_options = get_option('views_options');
if ($always || should_views_be_displayed($views_options)) {
$output = $prefix.str_replace('%VIEW_COUNT%', number_format_i18n($post_views), $views_options['template']).$postfix;
if($display) {
echo apply_filters('the_views', $output);
} else {
return apply_filters('the_views', $output);
}
}
elseif (!$display) {
return '';
}
}
3 answers
Несмотря на то, что в Wordpress рекомендуется использовать функции, возвращающие значения, это не всегда возможно, особенно когда вы вызываете другую функцию, которая записывает свои выходные данные непосредственно в поток.
Когда компонент записывает, он выводится непосредственно в поток, вам нужно закодировать, чтобы приспособить это поведение, если вы не хотите переписать компонент who (я бы этого не сделал ;-) ).
В данном случае функция the_views() на самом деле предлагает вам оба варианта. Если вы посмотрите на параметр $display и будете следовать коду, эта функция может работать в обоих направлениях. Если для параметра $display установлено значение True (по умолчанию), он отобразит результаты функции. Если для параметра $display установлено значение False, он вернет вывод.
Итак, у вас есть два варианта, оба из которых должны работать:
Вариант 1, Возвращайте значение
Обратите внимание, что когда я вызываю the_views() Я передаю ему ложный параметр, подобный этому: the_views(ложь)
<?php
function video_block( $atts, $content = null ) {
return "<div class=\"video-block\"><span class=\"ViewCount\">" . the_views(false) . "</span><a class=\"dl-source\" href=\"$content\">Link</a></div>";
}
?>
* Вариант 2: Повторите свой вывод *
Обратите внимание, что когда я вызываю функцию the_views(), ей не передаются никакие параметры.
<?php
function video_block( $atts, $content = null ) {
echo "<div class=\"video-block\"><span class=\"ViewCount\">";
the_views();
echo "</span><a class=\"dl-source\" href=\"$content\">Link</a></div>";
}
?>
О, кроме того, не забывайте избегать кавычек, когда возвращаете строку.
Не смог добавить блок кода в качестве комментария к ответу @Blewis, но, отрабатывая то, что он сказал, я сделал что-то вроде этого:
function my_shortcode() {
ob_start();
a_function_to_display();
$data = ob_get_clean();
return $data;
}
add_shortcode( 'shortcode_name', 'my_shortcode' );
Я хотел бы предложить здесь новый ответ.
Я работал над расширением плагина и обнаружил, что именно так это сделал автор, и для меня это имеет гораздо больше смысла.
Если вы выводите много HTML, вы не должны использовать echo
, это плохая практика, трудно читать и больно сохранять форматирование вывода с помощью echo
. Даже если вы используете его встречные части, все равно иметь echo_r
или print
или var_dump
менее чисто, чем использовать чистый HTML.
Начиная только с PHP выполняется внутри тегов-оболочек <?php
и ?>
, вы должны использовать это в своих интересах.
Но поскольку мы не можем просто сделать это здесь, потому что вы можете потерять свой порядок содержимого, вы можете использовать некоторое хранилище объектов. В принципе, прежде чем вы начнете свой HTML-блок (возможно, в начале вашей функции шорткода было бы неплохо), просто добавьте ob_start();
для хранения вашего кода. Затем, непосредственно перед завершением своей функции, вы можете return
свои данные с помощью $data = ob_get_clean();
и return $data;
.
Удачи с большим количеством WordPress работа.