Короткий код завжди відображається вгорі сторінки


15

Я використовую короткий код, щоб перетягувати різні петлі через loops-name.php. Чомусь він завжди знаходиться вгорі сторінки. Я переглянув його і використання echo замість повернення викликає цю проблему, але з моїм кодом я не використовую ехо. Ось короткий код:

// setup the shortcode for use
function friendly_loop_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array(
'category' => '',
'module' => ''
), $atts ) );

include(locate_template('loop-'.$module.'.php'));
 }

Будь-яка ідея, чому це відбувається?


Код для включення файлу? Я вважаю це трохи дивним.
Рутвік Гангурде

1
'з моїм кодом я не використовую ехо' - чи лунають файли loop-module.php або повертають свій вихід?
Майкл

На даний момент - у файлі просто є тег абзацу з "тестом", записаний у нього, щоб я міг бачити, як він працює.
Джон Джо

використовуйте get_template_part('loop',$module)натомість, це красивіше, швидше набирати, підтримує теми батьків / дітей, і це рекомендований метод включення шаблонів у wordpress (так, locate_template може робити деякі з цих речей, але виглядайте, наскільки це менш читабельно!)
Том Дж. Ноуелл

Відповіді:


16

Ви можете буферувати вихід таким чином:

ob_start();
include(locate_template('loop-'.$module.'.php'));
return ob_get_clean();

EDIT. Я спробував це, працював чудово.

function friendly_loop_shortcode( $atts, $content = null ) {
     extract( shortcode_atts( array(
         'category' => '',
         'module' => ''
     ), $atts ) );

     ob_start();
     include(locate_template('loop-'.$module.'.php'));
     $output = ob_get_clean();
     //print $output; // debug
     return $output;
}

if (!is_admin()) {
     add_shortcode('test', 'friendly_loop_shortcode' );
}


Боюся, що не вийшло.
Джон Джо

що пішло не так? Я спробував і оновив відповідь
offroff

8

Ваш включений файл по суті є перегукуваним HTML. Наприклад

<?php
 //Some PHP
 echo 'test';
 //Some more PHP
 ?>

Це те саме, що

<?php
 //Some PHP 
 ?>
 test
<?php
 //Some more PHP
 ?>

Обидва надрукуються негайно, а не повертаються. З моменту друку він з’являється перед вмістом сторінки. Вам потрібно повернути щось, щоб воно було включене до вмісту.

Як зазначав @RutwickGangurde - незвично включати файл шаблону в короткий код.


1
Спасибі, я цього не знав. Тож мені потрібно поставити всю річ у змінну і повернути її? Що стосується включення файлу шаблону - ну я хочу зробити його максимально простішим для користувачів теми, щоб налаштувати тему, і наявність величезного файлу короткого коду, вкладеного далеко від кореневої теми dir, насправді не ідеально для них.
Джон Джо

Дивіться відповідь @ offroff - це має спрацювати
Стівен Гарріс

1
" ну я хочу зробити це якомога простішим для користувачів теми, щоб налаштувати тему " - Яка кількість шарів абстракції необхідна? У вас є спеціальний файл шаблону всередині короткого коду. Я не бачу, як це полегшує роботу користувачам. Якщо ви хочете надати можливість додавати статичний вміст до всіх публікацій, просто визначте dynamic_sidebar()внутрішню петлю та дозвольте користувачам додавати віджети.
Чіп Беннетт

Більшість користувачів теми не оцінять необхідність перебирати масивний файл короткого коду, щоб змінити простий клас css на передній панелі. Якщо я розбиваю все, використовуючи стандартну систему loop-name.php, то їм набагато швидше знайти те, що їм потрібно. Не ідеально, але я повинен підтримувати їх щасливими;)
Джон Джо

Дуже добре пояснено;
Дієго Сомар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.