Get_template_part के लिए एक चर पासिंग


55

WP कोडेक्स का कहना है यह करने के लिए:

// You wish to make $my_var available to the template part at `content-part.php`
set_query_var( 'my_var', $my_var );
get_template_part( 'content', 'part' );

लेकिन मैं echo $my_varटेम्पलेट भाग के अंदर कैसे करूं ? get_query_var($my_var)मेरे लिए काम नहीं करता है।

मैंने locate_templateइसके बजाय उपयोग करने के लिए बहुत सारी सिफारिशें देखी हैं । यह जाने का सबसे अच्छा तरीका है?


था एक ही सवाल के बारे में और काम करने के लिए मिल गया के साथ set_query_varऔर get_query_var, लेकिन इस एक के मूल्यों का उपयोग कर के लिए था $argsसरणी है कि एक को पारित कर दिया है WP_Query। यह सीखना शुरू करने वाले अन्य लोगों के लिए मददगार हो सकता है।
23

जवाबों:


53

चूंकि पोस्ट उनके डेटा को the_post()(क्रमशः के माध्यम से setup_postdata()) सेट करते हैं और इसलिए एपीआई ( get_the_ID()उदाहरण के लिए) के माध्यम से सुलभ होते हैं , चलो मान लेते हैं कि हम उपयोगकर्ताओं के एक सेट के माध्यम से लूप कर रहे हैं (जैसा setup_userdata()कि वर्तमान में लॉग किए गए उपयोगकर्ता और isn के वैश्विक चर भरते हैं ) इस कार्य के लिए उपयोगी) और प्रति उपयोगकर्ता मेटा डेटा प्रदर्शित करने का प्रयास करें:

<?php
get_header();

// etc.

// In the main template file
$users = new \WP_User_Query( [ ... ] );

foreach ( $users as $user )
{
    set_query_var( 'user_id', absint( $user->ID ) );
    get_template_part( 'template-parts/user', 'contact_methods' );
}

फिर, हमारी wpse-theme/template-parts/user-contact_methods.phpफ़ाइल में, हमें यूज़र्स आईडी को एक्सेस करने की आवश्यकता है:

<?php
/** @var int $user_id */
$some_meta = get_the_author_meta( 'some_meta', $user_id );
var_dump( $some_meta );

बस।

स्पष्टीकरण वास्तव में आपके प्रश्न में उद्धृत भाग के ठीक ऊपर है:

हालाँकि, load_template()जिसे get_template_part()सभी अप्रत्यक्ष रूप से WP_Queryक्वेरी चर के अर्क द्वारा लोडेड टेम्प्लेट के दायरे में कहा जाता है ।

देशी PHP extract()फ़ंक्शन चर ( global $wp_query->query_varsसंपत्ति) को "अर्क" करता है और प्रत्येक भाग को अपने स्वयं के चर में डालता है जिसका कुंजी के समान नाम है। दूसरे शब्दों में:

set_query_var( 'foo', 'bar' );

$GLOBALS['wp_query'] (object)
    -> query_vars (array)
        foo => bar (string 3)

extract( $wp_query->query_vars );

var_dump( $foo );
// Result:
(string 3) 'bar'

1
अभी भी महान काम कर रहा
huraji

23

hm_get_template_partद्वारा समारोह humanmade इस पर बहुत अच्छी है और मैं इसे हर समय का उपयोग करें।

आप कॉल करें

hm_get_template_part( 'template_path', [ 'option' => 'value' ] );

और फिर अपने टेम्पलेट के अंदर, आप का उपयोग करें

$template_args['option'];

मान वापस करने के लिए। यह कैशिंग और सब कुछ करता है, हालांकि आप चाहें तो इसे निकाल सकते हैं।

तुम भी 'return' => trueकुंजी / मूल्य सरणी में पारित करके एक स्ट्रिंग के रूप में प्रदान की गई टेम्पलेट वापस कर सकते हैं ।

/**
 * Like get_template_part() put lets you pass args to the template file
 * Args are available in the tempalte as $template_args array
 * @param string filepart
 * @param mixed wp_args style argument list
 */
function hm_get_template_part( $file, $template_args = array(), $cache_args = array() ) {
    $template_args = wp_parse_args( $template_args );
    $cache_args = wp_parse_args( $cache_args );
    if ( $cache_args ) {
        foreach ( $template_args as $key => $value ) {
            if ( is_scalar( $value ) || is_array( $value ) ) {
                $cache_args[$key] = $value;
            } else if ( is_object( $value ) && method_exists( $value, 'get_id' ) ) {
                $cache_args[$key] = call_user_method( 'get_id', $value );
            }
        }
        if ( ( $cache = wp_cache_get( $file, serialize( $cache_args ) ) ) !== false ) {
            if ( ! empty( $template_args['return'] ) )
                return $cache;
            echo $cache;
            return;
        }
    }
    $file_handle = $file;
    do_action( 'start_operation', 'hm_template_part::' . $file_handle );
    if ( file_exists( get_stylesheet_directory() . '/' . $file . '.php' ) )
        $file = get_stylesheet_directory() . '/' . $file . '.php';
    elseif ( file_exists( get_template_directory() . '/' . $file . '.php' ) )
        $file = get_template_directory() . '/' . $file . '.php';
    ob_start();
    $return = require( $file );
    $data = ob_get_clean();
    do_action( 'end_operation', 'hm_template_part::' . $file_handle );
    if ( $cache_args ) {
        wp_cache_set( $file, $data, serialize( $cache_args ), 3600 );
    }
    if ( ! empty( $template_args['return'] ) )
        if ( $return === false )
            return false;
        else
            return $data;
    echo $data;
}

टेम्पलेट में एक पैरामीटर को पास करने के लिए कोड की 1300 लाइनें (जीथब एचएम से) परियोजना में शामिल करें? मेरी परियोजना में ऐसा नहीं कर सकते :(
Gediminas

11

मैं इधर-उधर देख रहा था और तरह-तरह के जवाब पा रहा था। यह एक देशी स्तर पर लगता है, वर्डप्रेस टेम्पलेट भागों में चर को एक्सेस करने की अनुमति देता है। मुझे लगता है कि find_template के साथ युग्मित का उपयोग करते हुए फ़ाइल में चर गुंजाइश के लिए सुलभ होने की अनुमति दी।

include(locate_template('your-template-name.php'));

का उपयोग करते हुए includeपारित नहीं होगा themecheck
लोटेकसून

क्या हमें वास्तव में ऐसी कोई चीज़ चाहिए जो WP थीम्स के लिए W3C चेकर की तरह हो?
फ्रेड 31

5
// you can use any value including objects.

set_query_var( 'var_name_to_be_used_later', 'Value to be retrieved later' );
//Basically set_query_var uses PHP extract() function  to do the magic.


then later in the template.
var_dump($var_name_to_be_used_later);
//will print "Value to be retrieved later"

मैं PHP निकालने () फ़ंक्शन के बारे में पढ़ने की सलाह देता हूं।


2

मैं इस परियोजना में इसी मुद्दे पर भाग रहा हूं, जिस पर मैं वर्तमान में काम कर रहा हूं। मैंने अपना स्वयं का छोटा प्लगइन बनाने का निर्णय लिया, जो आपको नए फ़ंक्शन का उपयोग करके get_template_part को अधिक स्पष्ट रूप से पास करने की अनुमति देता है।

यदि आपको यह उपयोगी लगता है, तो यहाँ GitHub पर इसके लिए पृष्ठ है: https://github.com/JolekPress/Get-Template-Part-With-Variables

और यहाँ एक उदाहरण है कि यह कैसे काम करेगा:

$variables = [
    'name' => 'John',
    'class' => 'featuredAuthor',
];

jpr_get_template_part_with_vars('author', 'info', $variables);


// In author-info.php:
echo "
<div class='$class'>
    <span>$name</span>
</div>
";

// Would output:
<div class='featuredAuthor'>
    <span>John</span>
</div>

1

मुझे पॉड्स प्लगइन और उनके पॉड_व्यू फंक्शन पसंद हैं। यह hm_get_template_partdjb के उत्तर में उल्लिखित फ़ंक्शन के समान काम करता है । मैं findTemplateवर्तमान थीम में पहले एक टेम्प्लेट फ़ाइल की खोज करने के लिए एक अतिरिक्त फ़ंक्शन ( नीचे दिए गए कोड में) का उपयोग करता हूं , और यदि यह नहीं पाया जाता है तो यह मेरे प्लगइन के /templatesफ़ोल्डर में उसी नाम के साथ टेम्पलेट देता है । यह एक मोटा विचार है कि मैं pods_viewअपने प्लगइन में कैसे उपयोग कर रहा हूं :

/**
 * Helper function to find a template
 */
function findTemplate($filename) {
  // Look first in the theme folder
  $template = locate_template($filename);
  if (!$template) {
    // Otherwise, use the file in our plugin's /templates folder
    $template = dirname(__FILE__) . '/templates/' . $filename;
  }
  return $template;
}

// Output the template 'template-name.php' from either the theme
// folder *or* our plugin's '/template' folder, passing two local
// variables to be available in the template file
pods_view(
  findTemplate('template-name.php'),
  array(
    'passed_variable' => $variable_to_pass,
    'another_variable' => $another_variable,
  )
);

pods_viewकैशिंग का भी समर्थन करता है, लेकिन मुझे अपने उद्देश्यों की आवश्यकता नहीं थी। फ़ंक्शन तर्कों के बारे में अधिक जानकारी पॉड्स प्रलेखन पृष्ठों में पाई जा सकती है। पॉड्स के साथ पॉड्स_व्यू और आंशिक पृष्ठ कैशिंग और स्मार्ट टेम्पलेट भागों के लिए पृष्ठ देखें ।


1

मानव जाति से कोड का उपयोग करके @djb के उत्तर के आधार पर।

यह get_template_part का एक हल्का संस्करण है जो args को स्वीकार कर सकता है। इस तरह से वैरिएबल को स्थानीय रूप से उस टेम्प्लेट में स्कोप किया जाता है। के लिए कोई ज़रूरत नहीं global, get_query_var, set_query_var

/**
 * Like get_template_part() but lets you pass args to the template file
 * Args are available in the template as $args array.
 * Args can be passed in as url parameters, e.g 'key1=value1&key2=value2'.
 * Args can be passed in as an array, e.g. ['key1' => 'value1', 'key2' => 'value2']
 * Filepath is available in the template as $file string.
 * @param string      $slug The slug name for the generic template.
 * @param string|null $name The name of the specialized template.
 * @param array       $args The arguments passed to the template
 */

function _get_template_part( $slug, $name = null, $args = array() ) {
    if ( isset( $name ) && $name !== 'none' ) $slug = "{$slug}-{$name}.php";
    else $slug = "{$slug}.php";
    $dir = get_template_directory();
    $file = "{$dir}/{$slug}";

    ob_start();
    $args = wp_parse_args( $args );
    $slug = $dir = $name = null;
    require( $file );
    echo ob_get_clean();
}

उदाहरण के लिए cart.php:

<? php _get_template_part( 'components/items/apple', null, ['color' => 'red']); ?>

इन apple.php:

<p>The apple color is: <?php echo $args['color']; ?></p>

0

इस बारे में कैसा है?

render( 'template-parts/header/header', 'desktop', 
    array( 'user_id' => 555, 'struct' => array( 'test' => array( 1,2 ) ) )
);
function render ( $slug, $name, $arguments ) {

    if ( $arguments ) {
        foreach ( $arguments as $key => $value ) {
                ${$key} = $value;
        }
    }

$name = (string) $name;
if ( '' !== $name ) {
    $templates = "{$slug}-{$name}.php";
    } else {
        $templates = "{$slug}.php";
    }

    $path = get_template_directory() . '/' . $templates;
    if ( file_exists( $path ) ) {
        ob_start();
        require( $path);
        ob_get_clean();
    }
}

उपयोग करके ${$key}आप चर को मौजूदा फ़ंक्शन स्कोप में जोड़ सकते हैं। मेरे लिए काम करता है, जल्दी और आसानी से और यह लीक या वैश्विक दायरे में संग्रहीत नहीं है।


0

उन लोगों के लिए, जो चर को पार करने का बहुत आसान तरीका देखते हैं, आप शामिल करने के लिए फ़ंक्शन बदल सकते हैं:

शामिल हैं (find_template ('YourTemplate.php', false, false));

और फिर आप उन सभी चरों का उपयोग करने में सक्षम होंगे जो आपके द्वारा परिभाषित किए जाने से पहले टेम्पलेट में शामिल किए गए हैं, इसके अलावा टेम्पलेट के लिए हर एक के अलावा।

श्रेय जाता है: https://mekshq.com/passing-variables-via-get_template_part-wordpress/


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.