O shortcode sempre é exibido na parte superior da página

15

Estou usando um código curto para obter loops diferentes através do loops-name.php. Por alguma razão, está sempre no topo da página. Eu pesquisei no Google e usar echo em vez de retornar causa esse problema, mas com meu código não estou usando echo. Aqui está o código curto:

// 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'));
 }

Alguma idéia de por que isso está acontecendo?

john joe
fonte
Shortcode para incluir um arquivo? Acho um pouco estranho.
Rutwick Gangurde
1
'com o meu código não estou usando echo' - os arquivos loop-module.php estão ecoando ou retornando sua saída?
Michael
Não no momento - o arquivo possui apenas uma tag de parágrafo com "test", para que eu possa ver como funciona.
john joe
em get_template_part('loop',$module)vez disso, é mais bonito, mais rápido de digitar, suporta temas de pai / filho e é o método recomendado para incluir modelos no wordpress (sim, o find_template pode fazer algumas dessas coisas, mas parece menos legível!)
Tom J Nowell

Respostas:

16

Você pode armazenar em buffer a saída assim:

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

EDITAR. Eu tentei isso, funcionou bem.

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
fonte
4
Não use buffer de saída se houver outras maneiras.
Fuxia
Receio que não funcionou.
john joe
o que deu errado? Eu tentei e atualizei a resposta
offroff
8

Seu arquivo incluído é essencialmente eco de HTML. Por exemplo

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

É o mesmo que

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

Ambos são impressos imediatamente, em vez de devolvidos. Desde a sua impressão, aparece antes do conteúdo da página. Você precisa retornar algo para que ele seja incluído no conteúdo.

Como o @RutwickGangurde apontou - é incomum incluir um arquivo de modelo em um código de acesso.

Stephen Harris
fonte
1
Obrigado, eu não sabia disso. Então, eu preciso colocar a coisa toda em uma variável e devolvê-lo? Quanto à inclusão de um arquivo de modelo - bem, eu quero facilitar o máximo possível para que os usuários do tema personalizem o tema e ter um enorme arquivo shortcode aninhado longe do diretório do tema raiz não é realmente ideal para eles.
john joe
Ver resposta da @ offroff - que deve funcionar
Stephen Harris
1
" bem, eu quero facilitar o máximo possível para que os usuários do tema personalizem o tema " - Quantas camadas de abstração são necessárias? Você tem um arquivo de modelo personalizado dentro de um código de acesso. Não vejo como isso facilita as coisas para os usuários. Se você deseja fornecer a capacidade de adicionar conteúdo estático a todas as postagens, basta definir um dynamic_sidebar()dentro do Loop e permitir que os usuários adicionem Widgets.
Chip Bennett
A maioria dos usuários temáticos não gostará de vasculhar um enorme arquivo shortcode para alterar uma classe css simples no frontend. Se eu quebrar tudo usando o sistema loop-name.php padrão, será muito mais rápido encontrar o que eles precisam. Não é o ideal, mas eu tenho que mantê-los felizes;)
john joe
Muito bem explicado;
precisa saber é o seguinte