Phần mẫu bên trong shortcode, kết quả bất ngờ

Aug 16 2020

Tôi đang cố gắng gọi một phần mẫu thông qua mã ngắn. Tôi đã đọc tất cả về cách thực hiện điều này nhiều lần trên trang web này nhưng sau khi thử một số cách vẫn không thể gọi một chuỗi thời gian echo php đơn giản. Tên tệp là test-one.php. Đây là những gì tôi đã thử:

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test', 'one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test-one' );
    return ob_get_clean();
}
add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'wp-content/themes/theme-name/template-parts/test-one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

Mã phần mẫu là

<?php

echo "Current as of <br>  ".date("m-d-Y h:i:sa");

Có vẻ như nó sẽ hoạt động, không? Tôi làm sai ở đâu?

Trả lời

2 Howdy_McGee Aug 17 2020 at 00:25

Các get_template_part()chức năng không chịu bất kỳ tên thư mục, bạn phải cung cấp nó một cách rõ ràng. Nó cũng liên quan đến thư mục chủ đề đang hoạt động. Vì vậy, trong nhiều ví dụ của bạn, nó đang tìm kiếm mẫu trong thư mục gốc của chủ đề đang hoạt động của bạn. Định dạng đúng sẽ là:

get_template_part( 'template-parts/test-one' );

Nếu muốn, bạn có thể đổi tên thư mục thành inchoặc includes- tùy ý. Bạn chỉ cần phản ánh sự thay đổi này trong lệnh gọi hàm.


Một lưu ý nhỏ, WordPress cho phép bạn truyền tham số thứ 2 và sẽ tìm kiếm các tệp được nối bằng dấu gạch ngang. Ví dụ, điều này cũng sẽ hoạt động:

get_template_part( 'template-parts/test', 'one' );

Lợi ích của việc này là nó cho phép bạn có nhiều "loại" của một bộ phận cụ thể. Bạn có thể có một content-post.phptệp để xuất nội dung bài đăng của mình và một tệp để xuất nội dung content-page.phptrang của bạn. Sau đó, trong chủ đề của bạn, bạn có thể gọi mẫu của mình bằng:

get_template_part( 'template-parts/content', $post->post_type );

Chỉ cho phép nó năng động hơn một chút.


Một lưu ý phụ khác. Bất kỳ lúc nào bạn gặp khó khăn với các loại chức năng này, bạn luôn có thể sử dụng:

add_action( 'init', function() {
    $template = locate_template( $template_string_here ); printf( '<pre>%s</pre>', print_r( $template, 1 ) );
    die( 'end' );
} );

Điều này sẽ xuất ra đường dẫn mẫu mà WordPress đang cố gắng truy cập vào mẫu bằng.