পৃষ্ঠাগুলি সম্পাদনা পৃষ্ঠায় মেটাবক্স এবং পৃষ্ঠা টেমপ্লেটগুলি যুক্ত করুন?


14

( মডারেটররা দ্রষ্টব্য: শিরোনামটি মূলত ছিল "আমি কীভাবে" পৃষ্ঠা বৈশিষ্ট্য "এবং / অথবা" পৃষ্ঠা বৈশিষ্ট্য> টেমপ্লেট "নির্বাচককে পোষ্টস সম্পাদকের সাথে যুক্ত করতে পারি))

ডাব্লুপি বর্তমানে কেবল পৃষ্ঠাগুলিতে একটি "টেমপ্লেট" বরাদ্দকরণের অনুমতি দেয় (উদা post_type=='page'।) আমি পোস্টেও এই কার্যকারিতাটি প্রসারিত করতে চাই (যেমন post_type=='post'।)

আমি কীভাবে "পৃষ্ঠার বৈশিষ্ট্যগুলি" মেটা বাক্স এবং আরও সুনির্দিষ্টভাবে পোস্ট সম্পাদকের টেম্পলেট পরিবর্তনকারীকে যুক্ত করতে পারি?

আমি ধরে নিচ্ছি এই কোডটি আমি functions.phpআমার থিমের জন্য রাখব।

আপডেট: আমি আমার পোস্ট এডিটরটিতে হার্ডকোডযুক্ত টেম্পলেটগুলি পুলডাউন মেনু যুক্ত করতে পরিচালিত করেছি, কেবলমাত্র আমার বিদ্যমান কাস্টম মেটা বিকল্প বাক্সে এইচটিএমএল নির্বাচন করুন adding আমি তার জন্য যে কোডটি ব্যবহার করছি তা এখানে ...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

এবং এখানে ফাংশন যা বিকল্পগুলি এবং টেমপ্লেট নির্বাচন বাক্সগুলি লিখেছে ...

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

এবং শেষ অবধি, সংরক্ষণে নির্বাচিত মানগুলি ক্যাপচারের জন্য কোড ...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

এখন, আমি বিশ্বাস করি যা বাকী রয়েছে তা হ'ল (1) নির্বাচিত টেম্পলেটটি ক্যাপচার করে এবং এই পোস্টের পোস্ট মেটাতে এটি যুক্ত করা এবং (2) সূচিপত্র পরিবর্তন করুন।


@ স্কট বি : আমি আপনার পুরো উত্তরটি লিখেছিলাম আগে আমি দেখেছি যে আপনি এটিতেও কাজ করছেন, এবং মনে হয় আপনি এটি কিছুটা ভিন্ন দিকে নিয়ে গিয়েছেন যে আপনার মূল প্রশ্নটি আপনার অনুসরণ এবং কোনও সূচক বিকল্পের সাথে নয়। আশা করি আমি এখনও যা করেছি তা আপনার জন্য মূল্যবান হবে। যদি তা না হয় তবে এটি অন্যকে সাহায্য করবে।
মাইকস্কিঙ্কেল

হ্যাঁ, আপনি প্রশ্নের উত্তর দিয়েছেন। একবার আমি বুঝতে পারলাম যে ডিরেক্টরিটি বিশ্লেষণের দরকার নেই এবং আমার নির্দিষ্ট টেমপ্লেটের মানগুলি হার্ডকোড করতে পারলাম। পোস্টের জন্য সঠিক নির্ধারিত টেম্পলেটটি ব্যবহার করার জন্য ডাব্লুপি বাস্তবায়নের জন্য আমার এখনও আপনার কোডটি ধার করতে হবে।
স্কট বি

উত্তর:


12

খারাপ সংবাদের ধারক হতে ঘৃণা তবে ওয়ার্ডপ্রেস কমপক্ষে v3.0 এ "পৃষ্ঠা" পোস্ট ধরণের পৃষ্ঠা টেম্পলেট কার্যকারিতাটিকে হার্ডকোড করে (এটি ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হতে পারে তবে এটি পরিবর্তন করার বিষয়ে আমি সচেতন একটি নির্দিষ্ট উদ্যোগ নেই) তবুও। সুতরাং আমি হ্যাকিং কোর ছাড়াই কীভাবে কোনও কিছু পেতে পারি তা নির্ধারণের জন্য খুব সংগ্রাম করছি times

আমি যে সমাধানটি নিয়ে এসেছি তা হ'ল মূলত ওয়ার্ডপ্রেস কোর থেকে প্রাসঙ্গিক কোডটি অনুলিপি করা এবং এটি আমাদের প্রয়োজনে সংশোধন করা। পদক্ষেপগুলি এখানে রয়েছে (লাইন নম্বরগুলি v3.0.1 এর থেকে রয়েছে):

  1. page_attributes_meta_box()535 এর লাইন থেকে ফাংশনটি অনুলিপি করুন/wp-admin/includes/meta-boxes.php এবং মামলা অনুসারে পরিবর্তন করুন।

  2. add_meta_boxes# 1-এ তৈরি মেটাবক্স যুক্ত করতে একটি হুক কোড করুন।

  3. get_page_templates()166 এর লাইন থেকে ফাংশনটি অনুলিপি করুন/wp-admin/includes/theme.php এবং মামলা অনুসারে পরিবর্তন করুন।

  4. page_template_dropdown()2550 এর লাইন থেকে ফাংশনটি অনুলিপি করুন/wp-admin/includes/template.php এবং মামলা অনুসারে পরিবর্তন করুন।

  5. আপনার থিমটিতে একটি পোস্ট টেম্পলেট যুক্ত করুন

  6. save_postসংরক্ষণের পরে পোস্ট টেম্পলেট ফাইলের নাম সংরক্ষণ করতে সক্ষম করতে একটি হুক কোড করুন।

  7. single_templateসম্পর্কিত পোস্টগুলির জন্য পোস্ট টেমপ্লেটের লোড সক্ষম করতে একটি হুক কোড করুন

এখন এটি দিয়ে!


1. page_attributes_meta_box()ফাংশনটি অনুলিপি করুন

আমাদের প্রথম পদক্ষেপ হিসাবে আপনার page_attributes_meta_box()ফাংশনটি 535 এর লাইন থেকে অনুলিপি করা উচিত /wp-admin/includes/meta-boxes.phpএবং আমি এটির নাম পরিবর্তন করতে বেছে নিয়েছি post_template_meta_box()। যেহেতু আপনি কেবল পৃষ্ঠা টেম্পলেটগুলির জন্য বলেছেন, আমি কোনও পিতামাতার পোস্ট নির্দিষ্ট করার জন্য এবং কোডটি আরও সহজ করে তোলে এমন ক্রম নির্দিষ্ট করার জন্য কোড বাদ দিয়েছি। আমি অনিচ্ছাকৃত মিলনের page_templateকারণে সৃষ্ট সম্ভাব্য অসম্পূর্ণতাগুলি এড়ানোর জন্য অবজেক্ট সম্পত্তিটি পুনরায় ব্যবহার করার চেষ্টা করার পরিবর্তে এর জন্য পোস্টমেটা ব্যবহার করাও বেছে নিয়েছি । সুতরাং এখানে কোড:

function post_template_meta_box($post) {
  if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
    $template = get_post_meta($post->ID,'_post_template',true);
    ?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
  } ?>
<?php
}

২. একটি add_meta_boxesহুক কোড করুন

পরবর্তী পদক্ষেপ add_meta_boxesহুক ব্যবহার করে মেটাবক্স যুক্ত করা :

add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
    add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}

৩. get_page_templates()ফাংশনটি অনুলিপি করুন

আমি ধরে নিয়েছি এটি কেবলমাত্র পৃষ্ঠা টেমপ্লেট এবং পোস্ট টেমপ্লেটের মধ্যে পার্থক্য করা বোধগম্য হবে সুতরাং এর লাইন 166 এর get_post_templates()উপর ভিত্তি করে কোনও ফাংশনের প্রয়োজন । তবে কোন পৃষ্ঠার টেমপ্লেটগুলি এই ফাংশনটি ব্যবহার করে তা চিহ্নিতকারী ব্যবহার করার পরিবর্তে আপনি নীচে দেখতে পাচ্ছেন যা পরিবর্তক ব্যবহার করে।get_page_templates()/wp-admin/includes/theme.phpTemplate Name:Post Template:

আমিও পরিদর্শন ফিল্টার functions.php (কীভাবে করবেন নিশ্চিত নন get_page_templates()কি কখনো সঠিকভাবে যে ছাড়া কাজ করেন, কিন্তু যাই হোক না কেন!) আর একমাত্র জিনিস বাম শব্দ পরিবর্তন রেফারেন্স হয় pageথেকে postরাস্তায় রক্ষণাবেক্ষণ পাঠযোগ্যতা জন্য:

function get_post_templates() {
  $themes = get_themes();
  $theme = get_current_theme();
  $templates = $themes[$theme]['Template Files'];
  $post_templates = array();

  if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
      $basename = str_replace($base, '', $template);
      if ($basename != 'functions.php') {
        // don't allow template files in subdirectories
        if ( false !== strpos($basename, '/') )
          continue;

        $template_data = implode( '', file( $template ));

        $name = '';
        if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
          $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
          $post_templates[trim( $name )] = $basename;
        }
      }
    }
  }

  return $post_templates;
}

৪. page_template_dropdown()ফাংশনটি অনুলিপি করুন

একইভাবে তৈরি করতে page_template_dropdown()2550 লাইন থেকে অনুলিপি করুন এবং কেবল পরিবর্তে কল করতে এটি পরিবর্তন করুন:/wp-admin/includes/template.phppost_template_dropdown()get_post_templates()

function post_template_dropdown( $default = '' ) {
  $templates = get_post_templates();
  ksort( $templates );
  foreach (array_keys( $templates ) as $template )
    : if ( $default == $templates[$template] )
      $selected = " selected='selected'";
    else
      $selected = '';
  echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
  endforeach;
}

৫. একটি পোস্ট টেম্পলেট যুক্ত করুন

পরবর্তী পদক্ষেপটি পরীক্ষার জন্য একটি পোস্ট টেম্পলেট যুক্ত করা হয়। আপনার থিমটি থেকে Post Template:পদক্ষেপ # 3 অনুলিপিটিতে উল্লিখিত চিহ্নিতকারীটি ব্যবহার করে নিম্নলিখিত মন্তব্য শিরোনামটি যুক্ত করুন (এতে কোনও কিছু সংশোধন করতে ভুলবেন না যাতে আপনি এটির পরিবর্তে লোড হচ্ছে তা বলতে পারেন ) :single.phpsingle-test.phpsingle-test.phpsingle.php

/**
 * Post Template: My Test Template
 */

আপনি # 1 এর মাধ্যমে # 5 পদক্ষেপগুলি সম্পন্ন করার পরে আপনি আপনার পোস্ট সম্পাদক পৃষ্ঠায় আপনার "পোস্ট টেম্পলেট" মেটাবক্সটি দেখতে পাবেন :

ওয়ার্ডপ্রেস 3.0.০-এ যুক্ত হওয়ার পরে মেটাবক্সের পোস্ট টেম্পলেটগুলি কেমন দেখাচ্ছে looked
(সূত্র: মাইকসচিনেল.কম )

6. একটি save_postহুক কোড করুন

এখন যখন আপনার এডিটরটি দূরে সরে গেছে তখন ব্যবহারকারী যখন "প্রকাশনা" ক্লিক করেন তখন আপনার পোস্ট টেম্পলেট ফাইলের নামটি পোস্টমেটায় সংরক্ষণ করতে হবে। এর জন্য কোডটি এখানে:

add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
  if ($post->post_type=='post' && !empty($_POST['post_template']))
    update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}

7. একটি single_templateহুক কোড করুন

এবং সর্বশেষে আপনার নতুন পোস্ট টেমপ্লেটগুলি ব্যবহার করার জন্য আপনাকে আসলে ওয়ার্ডপ্রেস নেওয়া দরকার। আপনি যে single_templateপোস্টগুলি নিয়োগ করেছেন তাদের জন্য আপনার কাঙ্ক্ষিত টেম্পলেট নামটি হুক করে এবং ফিরে দিয়ে:

add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
  global $wp_query;
  $post = $wp_query->get_queried_object();
  if ($post) {
    $post_template = get_post_meta($post->ID,'_post_template',true);
    if (!empty($post_template) && $post_template!='default')
      $template = get_stylesheet_directory() . "/{$post_template}";
  }
  return $template;
}

এবং এটি সম্পর্কে!

দ্রষ্টব্য যে আমি কাস্টম পোস্ট প্রকারগুলি বিবেচনা করি নি , কেবলমাত্র । আমার মতে কাস্টম পোস্ট ধরণের সম্বোধনের জন্য বিভিন্ন পোস্টের ধরণের মধ্যে পার্থক্য করা প্রয়োজন এবং অত্যধিক কঠিন না হলেও, আমি এখানে এটি চেষ্টা করি নি।post_type=='post'


গ্রেট! আমি ডিফল্ট ওয়ার্ডপ্রেস ফাংশনগুলি অনুলিপি করার একই পদ্ধতির সাথে আমার সম্পাদকের প্রায় সম্পূর্ণ কোড সহ ঘুমাতে গিয়েছিলাম (এটি সম্পূর্ণ ছিল, তবে আমি পরীক্ষা না করায় এটি পোস্ট করব না)। :)
sorich87

@ সরিচ ৮ - - আপনি পুরানো উক্তিটি জানেন যে "আপনি স্নুজ করুন, আপনি আলগা!" গুরুতরভাবে যদিও, শুধুমাত্র মজা করা। এটি কার্যকর করার জন্য কেবলমাত্র একটি যুক্তিসঙ্গত উপায় রয়েছে যাতে আপনার কোডটি একই রকম হয় তা অবাক হওয়ার কিছু নেই!
মাইকচিন্কেল

মাইক, আপনি অবাক করা অবিরত। এটিকে হাতুড়ি দেওয়ার জন্য সময় দেওয়ার জন্য অনেক ধন্যবাদ।
স্কট বি

@ সরিচ ৮ - - এতে কাজ করার জন্য ধন্যবাদ আমি সত্যিই প্রচেষ্টা প্রশংসা করি।
স্কট বি

1
@ স্কট বি : সমস্যা নেই, খুশী আমি সাহায্য করতে পারলাম। আমি যুক্তিযুক্ত জেনেরিক প্রশ্নগুলির সন্ধান করি যা সম্ভাব্যভাবে প্রচুর লোককে সহায়তা করতে পারে এবং কেবল প্রশ্ন জিজ্ঞাসা ব্যক্তির জন্য নয় তবে যারা পরে আসতে পারে তাদের জন্যও তাদের উত্তর দেওয়ার চেষ্টা করি।
মাইকচিনকেল

0

ওয়ার্ডপ্রেস আপনাকে একটি প্লাগইন ব্যবহার করে বিভাগগুলিতে মেটা যুক্ত করতে দেয়:

এটি করার জন্য আপনাকে বিভিন্ন এক্সটেনশনের একটি যুক্ত করতে হবে যা বিভাগগুলিতে মেটা যুক্ত করে (পৃষ্ঠাগুলি বাক্স থেকে কী বেরিয়ে আসে তা নকল করে), সিম্পল টার্ম মেটা কাজটি সুন্দরভাবে করে।

বিভাগ বাড়ানোর জন্য এনবি ওয়ার্ডপ্রেস 3.x প্রয়োজন।

এর পরে আপনি ব্যবহার করতে পারেন:

  • add_term_meta
  • update_term_meta
  • get_term_meta

আপনি যেমন করতে চান তেমন পদ্ধতি যুক্ত করতে ফাংশন.এফপি ব্যবহার করুন

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

থিমগুলিতে নতুন ক্ষেত্রগুলি কল করা সহজ:

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

আরও বিশদ এবং উদাহরণ: http://www.wphub.com/adding-metadata-taxonomy-terms/

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