Truyền các biến qua định vị


50

Mặc dù tôi thường sử dụng includehoặc requiretự mình sử dụng để tiết kiệm bảo trì mã dài hạn, tôi đã bắt đầu sử dụng get_template_partlocate_templatevì sử dụng công cụ WordPress tích hợp luôn là tốt nhất.

Câu hỏi của tôi là bạn có khả năng chuyển các biến qua kết quả của một trong hai get_template_parthoặc locate_templatekhông?

<?php
$var = get_option( 'my-custom-option' );

get_template_part( 'custom-template-part' );
?>

Trong đoạn mã trên $varsẽ được in bên trong mẫu tùy chỉnh nhưng biến không có vẻ hoạt động. Tôi đang thiếu một cái gì đó hay đây là hành vi dự kiến?

Tôi đã thấy rằng họ không vượt qua trong trường hợp trên hoặc khi sử dụng định vị

<?php
locate_template( 'custom-template-part.php', true );
?>

Câu trả lời:


62

Giống như MathSmath đã viết , get_template () không hỗ trợ việc sử dụng lại các biến của bạn.

Nhưng vô hướng xác định vị trí () không bao gồm cả. Nó chỉ định vị một tập tin để đưa vào.

Vì vậy, bạn có thể sử dụng bao gồm để làm việc này giống như bạn mong đợi:

include(locate_template('custom-template-part.php'));

$var từ ví dụ của bạn có thể được sử dụng trong phần mẫu sau đó.

Một câu hỏi liên quan với phần giải thích kỹ thuật hơn về phạm vi biến và get_template (): Lỗi gửi biểu mẫu với get_template_part ()


Cuộc gọi tốt Tôi không nhận thấy rằng location_template () có một thông số cho phép bạn tùy ý gọi load_template () với kết quả (mà get_template_part thực hiện) hoặc chỉ trả về chúng. Tôi đang lặp lại một dự án hiện tại để cập nhật mã bằng cách tiếp cận này ... cảm ơn!
MathSmath

Ngay sau khi tôi đăng ở đây, tôi đã kết thúc bằng cách sử dụng cùng một phương pháp.
curtismchale

21676 giải quyết vấn đề này, nhưng có vẻ như nó sẽ không được cam kết.
Ian Dunn

Có thể tôi sai nhưng: locate_template()infact không bao gồm, nếu tham số được đặt là true-as trong câu hỏi. (mặc định là falsevậy, vì vậy đừng dán phiên bản câu hỏi vào câu trả lời được chấp nhận.) Bạn cũng có thể chỉ cần sử dụng set_query_var('var', $var);và sử dụng get_template_part()như bình thường. Sau đó, bạn cũng có các biến Worpdress mặc định có thể truy cập trong tệp mẫu, như @MathSmath đã đề cập.
Jonas Lundman

13

Một giải pháp gọn gàng được tìm thấy trong codex

Vì vậy, nếu bạn đang lặp qua các bài đăng tùy chỉnh, bạn có thể làm điều này:

foreach ($custom_posts as $custom_post) {
    set_query_var( 'my_post', $custom_post );
    get_template_part( 'content', 'part' );
}

Và trong chính mẫu đó, bạn sẽ tự động nhận được một $my_post.


Đây sẽ là câu trả lời đúng nếu mã ví dụ đang trả lời câu hỏi. (Tùy chọn vượt qua, không hoàn thành mảng bài viết)
Jonas Lundman

Điều này hoạt động rất đẹp để truyền thông tin bổ sung cho mẫu bao gồm. Nó cũng hoạt động wc_get_template_parttrong WooC Commerce mà không nghi ngờ gì sẽ mở rộng WP mặc định.
nabrown

8

Tôi cũng gặp vấn đề với điều này (trong khi cố gắng để có một truy vấn tùy chỉnh để làm việc với một phần mẫu). Câu trả lời ngắn gọn là: không, phần mẫu không tự động kế thừa các vars tùy chỉnh theo cách thông thường.

Cuối cùng, cả get_template_part () và location_template () cuối cùng đều sử dụng hàm load_template () để thực sự tải tệp (sử dụng yêu cầu). Hàm này toàn cầu hóa các vars sau:

$ bài viết, $ bài đăng, $ wp_did_header, $ wp_did_template_redirect, $ wp_query, $ wp_rewrite, $ wpdb, $ wp_version, $ wp, $ id, $ comment, $ user_ID

Tuy nhiên, không có lọ nào khác xuất hiện từ bên trong phần mẫu. Tôi đoán vì yêu cầu thực tế được gói trong một hàm, phạm vi thay đổi hoặc một cái gì đó?

Dù sao đi nữa, tôi sẽ thử toàn cầu hóa bất kỳ bình bổ sung nào bạn cần vượt qua, sau đó gọi những quả cầu đó từ phần mẫu của bạn.


4

Chỉ cần hai xu của tôi để tham khảo trong tương lai, một cách giải quyết ít nhất trong Wordpress 3.5 là thêm biến vào $wp_query->query_vars.

Tôi cần toàn cầu của mình _vk_errorsbên trong một phần mẫu và chỉ cần làm $wp_query->query_vars['_vk_errors'] = $_vk_errors;trước khi gọi get_template_part().


2

Có chức năng đơn giản của tôi giải quyết vấn đề biến. Nó hoạt động tương tự như Wordpress làm trong get_template_part()chức năng. Chỉ cần sao chép và dán vàofunction.php

function getTemplatePart($slug = null, $name = null, array $params = array()) {
    global $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;

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

    $templates[] = "{$slug}.php";

    $_template_file = locate_template($templates, false, false);

    if (is_array($wp_query->query_vars)) {
        extract($wp_query->query_vars, EXTR_SKIP);
    }
    extract($params, EXTR_SKIP);

    require($_template_file);
}

Ví dụ về cách sử dụng trong mẫu

$params = array(
    'utm_source' => 'footer'
);
while ($posts->have_posts()) {
    $posts->the_post(); 
    getTemplatePart('content', 'heighlight', $params);
}

Trong content-heighlight.phpbiến có thể truy cập với tên $utm_sourcevà giá trịfooter


Chức năng thú vị. Có phải tất cả các vars toàn cầu và truy vấn thường có thể truy cập trong các tệp mẫu bình thường?
christian

0

Bạn chỉ có thể bọc get_template_part, lưu trữ một đối tượng mô hình trong một var toàn cục và xóa nó sau. Đây là cách chúng tôi đã và đang làm trong các dự án của chúng tôi:

Hàm.php

$model = null; // this is a global variable 
function my_get_template_part($slug, $name = null, $templateModel = null) {
    global $model;
    $model = $templateModel; // set the global var to the provided model object
    get_template_part($slug,$name); 
    $model = null; // clear the global var
}

function get_model() {
    global $model;
    return $model;
}

Cách sử dụng trong mẫu chính:

<?php my_get_template_part('template-parts/xxxx','xxx',array('test1'))?>

Truy cập mô hình được cung cấp trong phần mẫu:

<?php $model = get_model() ?>

Bằng cách này, bạn không phải sao chép và dán chức năng get_template_part ban đầu vào chức năng của chính mình trong trường hợp việc triển khai của nó có thể thay đổi sau đó bởi các nhà phát triển WP.

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.