Get_template_part এ পরিবর্তনীয় পাস করা


55

ডাব্লু কোডেক্স বলছেন এই কাজ করতে:

// 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। এটি শিখতে শুরু করা অন্যান্য ব্যক্তির জন্য সহায়ক হতে পারে।
lowtechsun

উত্তর:


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ক্যোয়ারী ভেরিয়েবলগুলি পরোক্ষভাবে বলা হয় ।

নেটিভ পিএইচপি 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
এখনও দুর্দান্ত কাজ করছে
হুরাজি

23

মনুষ্যনির্মিত দ্বারা hm_get_template_partফাংশন এটিতে অত্যন্ত ভাল এবং আমি এটি সর্বদা ব্যবহার করি।

আপনি ডাকুন

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 লাইন কোড (গিথুব এইচএম থেকে) অন্তর্ভুক্ত করবেন? আমার প্রকল্পে এটি করতে পারবেন না :(
গেডিমিনাস

11

আমি চারপাশে তাকিয়ে ছিলাম এবং বিভিন্ন উত্তর পেয়েছি। এটি স্থানীয় স্তরে মনে হয়, ওয়ার্ডপ্রেস টেম্পলেট অংশগুলিতে ভেরিয়েবলগুলি অ্যাক্সেস করার অনুমতি দেয়। আমি দেখতে পেলাম যে যুক্তগুলি যুক্ত করে পয়েন্ট-স্টেপলেট যুক্ত করে ব্যবহার করে ভেরিয়েবলের স্কোপটি ফাইলটিতে অ্যাক্সেসযোগ্য হয়ে উঠবে।

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

ব্যবহার করে থিমচেকinclude পাস হবে না ।
lowtechsun

আমাদের কি সত্যিই এমন কিছু দরকার যা ডাব্লুপি থিমগুলির জন্য ডাব্লু 3 সি পরীক্ষকের মতো?
ফ্রেডি 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"

আমি পিএইচপি এক্সট্র্যাক্ট () ফাংশন সম্পর্কে পড়ার পরামর্শ দিই।


2

আমি বর্তমানে একটি প্রকল্পে কাজ করছি যা আমি এই একই সমস্যার মধ্যে পড়েছিলাম। আমি আমার নিজের একটি ছোট প্লাগইন তৈরি করার সিদ্ধান্ত নিয়েছি যা আপনাকে নতুন ফাংশন ব্যবহার করে get_template_part এ আরও স্পষ্টভাবে ভেরিয়েবলগুলি পাস করার অনুমতি দেয়।

যদি আপনি এটি কার্যকর মনে হতে পারেন তবে গিটিহাবের জন্য এটির জন্য পৃষ্ঠাটি এখানে রয়েছে: 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_partডিজেবির উত্তরে উল্লিখিত ফাংশনের অনুরূপ কাজ করে । আমি 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

হিউম্যানমেড থেকে কোড ব্যবহার করে @ ডিজেবি-র উত্তরের ভিত্তিতে।

এটি get_template_part এর একটি হালকা ভার্সন যা আর্গ গ্রহণ করতে পারে। এইভাবে ভেরিয়েবলগুলি স্থানীয়ভাবে সেই টেমপ্লেটে স্কোপ করা হয়। আছে কোন প্রয়োজন নেই 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

ভেরিয়েবলগুলি পাস করার জন্য খুব সহজ উপায় দেখায় এমনদের জন্য, আপনি এতে অন্তর্ভুক্ত করার জন্য ফাংশন পরিবর্তন করতে পারেন:

অন্তর্ভুক্ত করুন (সনাক্ত করা_প্রেমীকরণ ('YourTemplate.php', মিথ্যা, মিথ্যা));

এবং তারপরে আপনি টেমপ্লেটের জন্য অতিরিক্ত প্রতিটি প্রত্যেকে পাস না করে টেম্পলেট অন্তর্ভুক্ত করার আগে সংজ্ঞায়িত সমস্ত ভেরিয়েবলগুলি ব্যবহার করতে সক্ষম হবেন।

ক্রেডিটগুলিতে যায়: https://mekshq.com/passing-variables-via-get_template_part-wordpress/


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.