Shortcode luôn hiển thị ở đầu trang


15

Tôi đang sử dụng một shortcode để kéo các vòng lặp khác nhau thông qua các vòng lặp-name.php. Vì một số lý do, nó luôn ở đầu trang. Tôi đã googled nó và sử dụng echo thay vì return gây ra vấn đề đó nhưng với mã của tôi, tôi không sử dụng echo. Đây là shortcode:

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

Bất cứ ý tưởng tại sao điều này đang xảy ra?


Shortcode để bao gồm một tập tin? Tôi thấy nó hơi kỳ quặc.
Rutwick Gangurde

1
'với mã của tôi, tôi không sử dụng echo' - các tệp loop-module.php có lặp lại hoặc trả lại đầu ra của chúng không?
Michael

Không phải lúc này - tập tin chỉ có một thẻ đoạn với "test" được viết vào nó để tôi có thể thấy nó hoạt động như thế nào.
john joe

sử dụng get_template_part('loop',$module)thay vào đó, nó đẹp hơn, nhanh hơn để gõ, chủ đề hỗ trợ phụ huynh / trẻ em, và đó là phương pháp đề nghị của bao gồm mẫu trong wordpress (có locate_template có thể làm một số trong những điều đó nhưng nhìn nó là bao nhiêu ít có thể đọc được!)
Tom J Nowell

Câu trả lời:


16

Bạn có thể đệm đầu ra như thế này:

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

BIÊN TẬP. Tôi đã thử điều này, làm việc tốt.

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

4
Không sử dụng bộ đệm đầu ra nếu có những cách khác.
fuxia

Tôi sợ rằng đã không làm việc.
john joe

có chuyện gì? Tôi đã thử và cập nhật câu trả lời
tắt

8

Tệp bao gồm của bạn về cơ bản là tiếng vang HTML. Ví dụ

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

Giống như

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

Cả hai được in ngay lập tức thay vì trả lại. Kể từ khi được in, nó xuất hiện trước nội dung trang. Bạn cần phải trả lại một cái gì đó cho nó được bao gồm trong nội dung.

Như @RutwickGangurde đã chỉ ra - thật bất thường khi đưa tệp mẫu vào một mã ngắn.


1
Cảm ơn, tôi không biết điều đó. Vì vậy, tôi cần phải đặt toàn bộ vào một biến và trả lại nó? Đối với việc bao gồm một tệp mẫu - tôi muốn làm cho người dùng chủ đề dễ dàng tùy chỉnh chủ đề và có một tệp mã ngắn khổng lồ được đặt cách xa thư mục gốc không thực sự lý tưởng đối với họ.
john joe

Xem câu trả lời của @ offroff - nên hoạt động
Stephen Harris

1
" Tôi cũng muốn làm cho người dùng chủ đề dễ dàng tùy chỉnh chủ đề " - Chỉ cần bao nhiêu lớp trừu tượng là cần thiết? Bạn đã có một tệp mẫu tùy chỉnh bên trong một shortcode. Tôi không thấy cách đó giúp mọi người dễ dàng hơn. Nếu bạn muốn cung cấp khả năng thêm nội dung tĩnh cho tất cả các bài đăng, chỉ cần xác định dynamic_sidebar()bên trong Vòng lặp và cho phép người dùng thêm Widget.
Chip Bennett

Hầu hết người dùng chủ đề sẽ không đánh giá cao việc phải duyệt qua một tệp shortcode lớn để thay đổi một lớp css đơn giản trên frontend. Nếu tôi phá vỡ mọi thứ bằng cách sử dụng hệ thống loop-name.php tiêu chuẩn thì họ sẽ nhanh hơn rất nhiều để tìm thấy thứ họ cần. Không lý tưởng nhưng tôi phải giữ cho họ hạnh phúc;)
john joe

Giải thích rất tốt;
DR.Somar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.