2012-09-07 26 views
9

Tôi có một trang mà tôi cần cho phép người dùng nhập một đoạn văn bản. Sau đó, sau văn bản đó, chèn một shortcode sẽ hiển thị danh sách bài đăng, sau đó thêm văn bản dạng tự do khác sau đó. Suy nghĩ của tôi là họ sẽ có thể chèn một shortcode mà sẽ xuất ra các bài viết. Bằng cách này, họ có thể chỉ cần thêm shortcode nơi họ muốn các bài viết xuất hiện.Gọi WordPress get_template_part từ bên trong một hàm shortcode hiển thị mẫu đầu tiên

Tôi hiện có logic truy xuất các bài đăng được tách riêng trong tệp riêng của nó. Hiện nay tôi bao gồm nó trong một trang bằng cách đơn giản bằng cách sử dụng get_template_part() chức năng:

get_template_part('donation', 'posts'); 

Tôi nhìn vào cách tạo một shortcode và bao gồm đoạn mã sau vào tập tin functions.php của tôi để tạo shortcode:

add_shortcode('donation-posts', 'fnDonatePosts'); 
function fnDonatePosts($attr, $content) 
{ 
    get_template_part('donation', 'posts');  
} 

donation-posts.php đang được thực thi đúng cách và các bài đăng xuất hiện, tuy nhiên, chúng luôn được định vị TRƯỚC KHI nội dung và không ở vị trí đặt mã ngắn.

Tôi đã thử xóa chức năng get_template_part() và chỉ xuất một số văn bản và hoạt động tốt. Vì vậy, tôi hiểu rằng get_template_part() có thể không đúng cách để làm điều này, tuy nhiên, tôi đã không thể phát hiện ra một cách để làm những gì tôi đang cố gắng làm (Tôi chắc chắn rằng có một cách ... Tôi chỉ cần thiên đường không tìm thấy nó).

Tôi đã thử:

include(get_template_directory(). '/donation-posts.php'); 
include_once(get_template_directory(). '/donation-posts.php') : 

Nhưng những xử lý dừng lại một khi họ nhấn mã PHP trong file bao gồm.

Tôi cũng đã cố gắng:

$file = file_get_contents(get_template_directory(). '/donation-posts.php'); 
     return $file; 

Nhưng điều này chỉ trả về các nội dung của tập tin (như tên hàm chỉ ra) có nghĩa là nó không thực hiện kịch bản PHP để trả lại bài đăng nào.

Có ai đã thực hiện việc này trước đây không?

Trả lời

18

Bạn có thể thử điều này, nó có thể giải quyết vấn đề của bạn vì get_template_part về cơ bản phản ứng như PHP'srequire, nó không trả lại mà lặp lại nội dung ngay khi được gọi.

add_shortcode('donation-posts', 'fnDonatePosts'); 
function fnDonatePosts($attr, $content) 
{   
    ob_start(); 
    get_template_part('donation', 'posts'); 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret;  
} 
+0

Xin lỗi đã mất quá nhiều thời gian để tôi phản hồi nhưng tôi có rất nhiều dự án trên đĩa và đây là dự án Pro-Bono để phù hợp với các ưu tiên. Dù sao, sửa chữa của bạn chỉ là những gì tôi cần! Cảm ơn bạn! –

+0

Bạn được chào đón :-) –

+1

nó là một giải pháp xấu xí như vậy nhưng nó là tốt nhất (chỉ?) Một. – Stefan

7

Đây là phiên bản động hơn, nơi bạn có thể chuyển đường dẫn đến mẫu.

function template_part($atts, $content = null){ 
    $tp_atts = shortcode_atts(array( 
     'path' => null, 
    ), $atts);   
    ob_start(); 
    get_template_part($tp_atts['path']); 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret;  
} 
add_shortcode('template_part', 'template_part'); 

Và shortcode:

[template_part path="includes/social-sharing"] 
+0

Rực rỡ, mặc dù SO nói với tôi rằng các bình luận không có ở đây cho cụm từ * cảm ơn bạn * Tôi chỉ có thể nói, cảm ơn bạn, mô đun tuyệt vời! – Luis

1

phiên bản tối thiểu của câu trả lời được chấp nhận:

function my_template_part_shortcode() { 
    ob_start(); 
    get_template_part('my_template'); 
    return ob_get_clean(); 
} 
add_shortcode('my_template_part', 'my_template_part_shortcode'); 

nơi my-template.php là file bạn muốn đưa vào.

1

get_template_part() không hoạt động đối với tôi khi sử dụng nó trong functions.php. Tôi đã sử dụng hàm locate_template() bên trong ob_start và clean để thay thế.Ví dụ:

function full_petition_shortcode($attr) { 
    ob_start(); 
    locate_template('petition.php', TRUE, TRUE); 

    return ob_get_clean(); 
} 
add_shortcode('full-petition', 'full_petition_shortcode'); 
Các vấn đề liên quan