Có thể ghi đè kết quả của get_template_part () không?


11

Tôi đang làm việc trên một chủ đề con, tôi đặc biệt không muốn ghi đè các tệp mẫu chính để duy trì tính đơn giản của chủ đề con cũng như giảm thiểu số lượng mã và bảo trì theo thời gian.

Trong vòng lặp, mẫu index.php trong chủ đề gốc sử dụng: get_template_part( 'content' );

Điều này sẽ mang đến content.php , tôi đang tìm cách để nó hoạt động giống get_template_part( 'content', get_post_format() );hoặc tương tự hơn để mang các mẫu khác nhau như content-sid.php , v.v., mà không tạo ra một tệp index.php trong chủ đề con để ghi đè lên cha mẹ cho một thay đổi dòng duy nhất.

get_template_part() bao gồm:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

Vì vậy, có một hành động có sẵn, trong trường hợp của tôi được gọi là get_template_part_content

Tôi có thể nối vào hành động bằng một cái gì đó như:

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

Điều này rõ ràng dẫn đến sự trùng lặp bài đăng, một từ chức năng hooked của tôi, có thể hiển thị mẫu mong muốn và cái khác từ locate_templatecuộc gọi bình thường trongget_template_part()

Tôi đang gặp khó khăn khi tìm một cách để thực hiện điều này mà không trùng lặp, hoặc không có kết thúc hiển thị trang ngay sau khi mẫu phân phát một phần của tôi bằng cách làm một cái gì đó ngu ngốc như một breakhoặcexit



3
Chào mừng đến với cuộc sống khốn khổ mà không có thừa kế mẫu. :)
Rarst

Câu trả lời:


3

Không có móc để làm điều này. Sao chép index.php vào chủ đề con và thực hiện thay đổi dòng đơn. Ngoài ra, hãy nói với tác giả của chủ đề phụ huynh rằng họ nên tạo ra sự thay đổi tương tự trong chủ đề của họ, để linh hoạt.


Điều này là sai ngay bây giờ, xem @ t-toudua trả lời ở đây
Ivan Castellanos

Câu trả lời của ông không phải là một giải pháp, bởi vì phần mẫu vẫn tải và bao gồm. Móc hành động không thể ghi đè lên điều đó.
Otto

Đúng, nhưng bạn có thể sử dụng ob_startbên trong nó và ob_endtại một số hook sau để nó được thực thi nhưng không bao giờ lặp lại, thường là đủ tốt. Hoặc bạn có thể sử dụng exit () để buộc chấm dứt PHP (sau khi bạn thêm thủ công mọi thứ vẫn còn thiếu: chân trang, v.v.)
Ivan Castellanos

Và đó vẫn chưa phải là một giải pháp. Việc ngăn chặn đầu ra không giống như ghi đè mọi thứ.
Otto

Thoát không ngăn chặn đầu ra; nó thực sự dừng thực thi tại thời điểm đó.
Ivan Castellanos

6

Tôi nghĩ rằng nó không chính xác có thể theo cách bạn muốn đạt được. Thật khó chịu khi không có bộ lọc ở đó để thay đổi tên tệp mẫu :(

Tôi có một cách giải quyết về nó mặc dù. Hãy sử dụng content.phpđể so sánh.

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

Tôi đã không sử dụng đối số thứ hai của get_template_parthàm, thay vào đó tôi đã chuyển hậu tố vào đối số thứ nhất để tránh các cuộc gọi vô định trên content.phptệp nếu không có 'content-'. $formattệp.


Tôi nghĩ rằng đây là một cách tốt để làm điều đó. Không chắc tại sao nó không được chấp nhận :)
Anh Trần

Vấn đề danh tiếng, có thể :)
Shazzad 16/07/14

Xin lỗi @Shazzad, tôi đã đưa ra câu trả lời của bạn một upvote vì nó rất thông minh :) Nếu tôi có thể chấp nhận hai, tôi sẽ làm thế.
TomHarrigan

3

Vâng, có GIẢI PHÁP :

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

nhưng hãy suy nghĩ cẩn thận, trong đó hook bạn nên chèn hành động đó ... để tự lấy vị trí, sử dụng, tức là locate_template('content-header.php', false);


0

Nếu bạn muốn lấy một tệp có tên là content-sid.php, bạn gọi hàm như thế này:

get_template_part( 'content', 'aside' );

Tham số thứ hai là tên của filer sau dấu gạch nối. Nếu tệp của bạn nằm trong thư mục con (samples / content-sid.php):

get_template_part( 'templates/content', 'aside' );

Đó có phải là những gì bạn đang muốn làm?


Cảm ơn, tôi hiểu điều đó. Tôi đang tìm cách không phải tạo một tệp index.php trong chủ đề con để ghi đè lên chủ đề gốc index.php cho một thay đổi dòng đơn. Nó thêm bảo trì nhiều hơn cho chủ đề con. Hy vọng sẽ hoàn thành thông qua một cái móc nếu có thể.
TomHarrigan
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.