Проблема возвращает функцию внутри шорткода в 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 '';
    }
}
Author: Michal Kopanski, 2011-02-07

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

?>

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

 5
Author: Steve Massing, 2011-02-09 03:52:49

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

function my_shortcode() {
  ob_start();
  a_function_to_display();
  $data = ob_get_clean();
  return $data;
}
add_shortcode( 'shortcode_name', 'my_shortcode' );
 3
Author: bryceadams, 2014-06-09 14:02:06

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

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

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

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

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

Удачи с большим количеством WordPress работа.

 2
Author: BLewis, 2013-09-01 12:54:24