Проблема возврата функции внутри шорткода в Wordpress - PullRequest
3 голосов
/ 07 февраля 2011

Эй, ребята, у меня возникли проблемы с кодированием шорткода тем. Я хочу, чтобы код отображал div с функцией счетчика просмотров, а затем ссылку с содержимым кодов в качестве 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, что вы должны возвращать (вместо эха) значения внутри функций, но это нарушает его, отображая количество просмотров, пропуская html и выплевывая содержимое $.

Вот ссылка на соответствующую страницу: http://nvrt.me/4Qf1 (в настоящее время используется код из блока № 2)

У меня кончается полночное масло. Буду очень признателен, если кто-нибудь сможет мне помочь.


EDIT:

Вот код для 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 ]

5 голосов
/ 07 февраля 2011

Несмотря на то, что в Wordpress рекомендуется иметь функции, возвращающие значения, это не всегда возможно , особенно когда вы вызываете другую функцию, которая записывает свой вывод непосредственно в поток.

Когда компонент записывает свой вывод непосредственно в поток, вам нужно кодировать, чтобы приспособиться к такому поведению, если вы не хотите переписывать компонент who (я бы этого не делал ;-)).

В этом случае функция the_views () фактически предлагает вам оба варианта. Если вы посмотрите на параметр $ display и выполните код, эта функция может работать в обоих направлениях. Если для параметра $ display установлено значение True (по умолчанию), результаты функции будут отражены. Если $ display установлен в False, он вернет вывод.

Итак, у вас есть два варианта, оба из которых должны работать:

Вариант 1, вернуть значение

Обратите внимание, что когда я вызываю the_views (), я передаю ему ложный параметр, например: the_views (false)

<?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>";
}

?>

О, также не забывайте избегать кавычек, когда возвращаете строку.

3 голосов
/ 09 июня 2014

Не удалось добавить блок кода в качестве комментария к ответу @BLewis, но, отработав его слова, я сделал что-то вроде этого:

2 голосов
/ 01 сентября 2013

Я хотел бы добавить новый ответ здесь.

Я работал над расширением плагина и обнаружил, что автор так и сделал, и для меня это имеет гораздо больший смысл.

Если вы выводите много HTML, вы не должны использовать echo, это плохая практика, трудно читаемая и нехорошо поддерживать форматирование вывода, используя echo. Даже если вы используете его встречные части, все же менее чисто иметь echo_r или print или var_dump, чем использовать чистый HTML.

Поскольку PHP работает только внутри тегов-обёрток <?php и ?>, вы должны использовать это в своих интересах.

Но так как мы не можем просто сделать это здесь, потому что вы можете потерять свой порядок контента, вы можете использовать хранение некоторых объектов. В основном, прежде чем вы начнете свой HTML-блок (вероятно, в начале вашей функции шорткода будет хорошо), просто добавьте ob_start();, чтобы сохранить ваш код. Затем, непосредственно перед завершением функции, вы можете return свои данные, используя $data = ob_get_clean(); и return $data;.

Удачи вам в работе над WordPress.

...