Kode pendek selalu ditampilkan di bagian atas halaman

15

Saya menggunakan kode pendek untuk menarik loop yang berbeda melalui loop-name.php. Untuk beberapa alasan, selalu ada di bagian atas halaman. Saya meng-google-nya dan menggunakan gema bukannya mengembalikan menyebabkan masalah itu tetapi dengan kode saya saya tidak menggunakan gema. Berikut kode singkatnya:

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

Tahu mengapa hal ini terjadi?

john joe
sumber
Kode pendek untuk memasukkan file? Saya merasa sedikit aneh.
Rutwick Gangurde
1
'dengan kode saya, saya tidak menggunakan echo' - apakah file loop-module.php menggemakan atau mengembalikan outputnya?
Michael
Tidak pada saat ini - file hanya memiliki tag paragraf dengan "test" ditulis sehingga saya dapat melihat cara kerjanya.
john joe
gunakan get_template_part('loop',$module)saja, ini lebih cantik, lebih cepat untuk mengetik, mendukung tema orangtua / anak, dan ini adalah metode yang disarankan untuk menyertakan templat di wordpress (ya loc_template dapat melakukan beberapa hal tetapi melihat betapa jauh lebih mudah dibaca itu!)
Tom J Nowell
kemungkinan rangkap dari Hasil kode pendek muncul SEBELUM konten halaman
Chip Bennett

Jawaban:

16

Anda dapat buffer output seperti ini:

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

EDIT. Saya mencoba ini, bekerja dengan baik.

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' );
}
diluar
sumber
4
Jangan gunakan buffering output jika ada cara lain.
fuxia
Saya khawatir itu tidak berhasil.
john joe
apa yang salah? Saya mencoba dan memperbarui jawabannya
offroff
8

File Anda yang disertakan pada dasarnya menggemakan HTML. Contohnya

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

Sama dengan

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

Keduanya langsung dicetak daripada dikembalikan. Sejak dicetak itu muncul sebelum konten halaman. Anda harus mengembalikan sesuatu agar dapat dimasukkan ke dalam konten.

Seperti yang ditunjukkan oleh @RutwickGangurde - tidak biasa untuk memasukkan file templat dalam kode pendek.

Stephen Harris
sumber
1
Terima kasih, saya tidak tahu itu. Jadi saya perlu memasukkan semuanya ke dalam variabel dan mengembalikannya? Sedangkan untuk memasukkan file template - well, saya ingin membuatnya semudah mungkin bagi pengguna tema untuk menyesuaikan tema dan memiliki file kode pendek besar yang bersarang jauh dari dir tema root tidak benar-benar ideal untuk mereka.
john joe
Lihat jawaban @ offroff - yang seharusnya berhasil
Stephen Harris
1
" Yah saya ingin membuatnya semudah mungkin bagi pengguna tema untuk menyesuaikan tema " - Hanya berapa banyak lapisan abstraksi yang diperlukan? Anda punya file templat khusus di dalam kode pendek. Saya tidak melihat bagaimana hal itu membuat segalanya lebih mudah bagi pengguna. Jika Anda ingin memberikan kemampuan untuk menambahkan konten statis ke semua posting, cukup tentukan sebuah dynamic_sidebar()di dalam Loop, dan biarkan pengguna menambahkan Widget.
Chip Bennett
Sebagian besar pengguna tema tidak akan menghargai harus menjelajah melalui file shortcode besar untuk mengubah kelas css sederhana di frontend. Jika saya memecah semuanya menggunakan sistem loop-name.php standar maka itu jauh lebih cepat bagi mereka untuk menemukan apa yang mereka butuhkan. Tidak ideal tetapi saya harus membuat mereka bahagia;)
john joe
Sangat dijelaskan;
DR.Somar