Задать вопрос
@sergey_harchevnikov
Web программист

Как сделать, что бы данные из шорткода в ворпрессе загружаются не на самом верху страницы?

В общем вопрос в заголовке. Я так же нашел инфу, что надо что бы функция возвращала результат, а не показывала его. Для этого надо использовать ob_start(); Я попробовал, но вылетает ошибка:
Fatal error: Call to undefined function shortcodeSliderInit()
Хотя функцию я объявлял, вот код:
public function shortcodeSliderInit($name)
    {
 
 
        if (!$name) {
            return '';
        }
        
        $slider = ale_sliders_get_slider($name);
        if (!$slider) {
            return '';
        }
        
        $slider_id = sanitize_title('ale-slider-' . $slider['slug'] . '-' . wp_generate_password(5, false));
 
        ?>
        <div id="<?php echo $slider_id ?>" class="ale-slider-slides">
            <div class="owl-carousel owl-theme">
            
                    <?php foreach ($slider['slides'] as $slide) : ?>
                        
                        
                            <?php if ($slide['image']) : ?>
                                
                                    <?php if ($slide['url']) : ?>
                                        <a href="<?php echo $slide['url'] ?>" class="swipebox">
                                    <?php endif; ?>
                                            <img src="<?php echo $slide['image']?>" alt="<?php $slide['title'] ?>" />
                                    <?php if ($slide['url']) : ?>
                                        </a>
                                    <?php endif; ?>
                            
                            
                            <?php endif; ?>
                        
                    <?php endforeach; ?>
            
            </div>
        </div>
        
        <?php
    }
    
    public function shortcodeSlider($name){
        ob_start();
        shortcodeSliderInit($name);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }
    public function generalInit() 
    {
        add_shortcode('ale-slider', array($this, 'shortcodeSlider'));
    }
  • Вопрос задан
  • 34 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
cesnokov
@cesnokov
<head>&nbsp;</head>
Можно и без буфера обойтись, просто записывая всё в переменную. Ваш код:

function getShortcodeOutput() {
    ob_start();
    echo "some text1\n";
    echo "some text2\n";
    echo "some text3\n";
    echo "some text4\n";
    $result = ob_get_contents();
    ob_end_clean();
    return $result;
}


Поменяв на:
function getShortcodeOutput() {
    $result = "";
    $result .= "some text1\n";
    $result .= "some text2\n";
    $result .= "some text3\n";
    $result .= "some text4\n";
    return $result;
}


И получиться:
function shortcodeSliderInit($atts) {

	$result = '';
	extract(shortcode_atts(array(
		'name' => '',
		'slideshow' => 0,
		'animation' => 'fade',
		'controlnav' => 0,
		'randomize' => 0
	), $atts));

	if (!$name) { return FALSE; }
	$slider = ale_sliders_get_slider($name);
	if (!$slider) { return FALSE; }
	$slider_id = sanitize_title('ale-slider-' . $slider['slug'] . '-' . wp_generate_password(5, false));

	$result .= '<div id="' . $slider_id . '" class="ale-slider-slides">';
	$result .= '<div class="owl-carousel owl-theme">';
	foreach ($slider['slides'] as $slide) {
		if ($slide['image']) {

			if ($slide['url']) {
				$result .= '<a href="' . $slide['url'] . '" class="swipebox">';
			}

			$result .= '<img src="' . $slide['image'] . '" alt="' . $slide['title'] . '" />';

			if ($slide['url']) {
				$result .= '</a>';
			}
			
		}
		
	}
	$result .= '</div>';
	$result .= '</div>';

	return $result;
}
Ответ написан
@sergey_harchevnikov Автор вопроса
Web программист
Нашел сам ответ :) Тут функция должна возвращать параметры, а не показывать. Обычно достаточно echo на return заменить, но в более сложных функциях, типа моей, надо обверку делать, для буферизации. Типа:
<?php
 
$text = getShortcodeOutput();
echo "--- before text\n";
echo $text;
echo "--- after text\n";
 
function getShortcodeOutput() {
    ob_start();
    echo "some text1\n";
    echo "some text2\n";
    echo "some text3\n";
    echo "some text4\n";
    $result = ob_get_contents();
    ob_end_clean();
    return $result;
}


Вот что у меня получилось:
public function shortcodeSliderInit($atts)
	{
		ob_start();
		extract(shortcode_atts( array(
			'name'		=> '',
			'slideshow' => 0,
			'animation' => 'fade',
			'controlnav'=> 0,
			'randomize' => 0,
		), $atts));		
		
		if (!$name) {
			return '';
		}
		
		$slider = ale_sliders_get_slider($name);
		if (!$slider) {

			return '';
		}
		
		$slider_id = sanitize_title('ale-slider-' . $slider['slug'] . '-' . wp_generate_password(5, false));

		?>
		<div id="<?php echo $slider_id ?>" class="ale-slider-slides">
			<div class="owl-carousel owl-theme">
			
					<?php foreach ($slider['slides'] as $slide) : ?>
						
						
							<?php if ($slide['image']) : ?>
								
									<?php if ($slide['url']) : ?>
										<a href="<?php echo $slide['url'] ?>" class="swipebox">
									<?php endif; ?>
											<img src="<?php echo $slide['image']?>" alt="<?php $slide['title'] ?>" />
									<?php if ($slide['url']) : ?>
										</a>
									<?php endif; ?>
							
							
							<?php endif; ?>
						
					<?php endforeach; ?>
			
			</div>
		</div>
		
		<?php
		  $result = ob_get_contents();
		  ob_end_clean();
		  return $result;
	}


Всё заработало как надо!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы