বিদ্যমান পোস্টের ড্রপডাউন দ্বারা কাস্টম ফিল্ড / মেটা জনবহুল?


11

(আমার প্রথম ডাব্লুপি প্রশ্ন কখনও জিজ্ঞাসা করেছিল! নম্র হোন!)

আমি একটি সাইট তৈরি করছি যা বেশিরভাগ পৃষ্ঠাগুলি (অর্থাত্ স্থির), ডাব্লুপি কে সিএমএস হিসাবে ব্যবহার করে। পৃষ্ঠাগুলির বেশিরভাগের নীচে, 1, 2, বা 3 টি "প্রোমো বাক্স" উপস্থিত হবে - মূলত সাইটের অন্যান্য অংশের সাথে লিঙ্কযুক্ত বোতাম-চিত্রগুলি। যদিও কোনও প্রদত্ত পৃষ্ঠায় কেবল 3 টি পর্যন্ত প্রোমো বাক্স প্রদর্শিত হবে, সেখানে বেছে নিতে to 30 টি আলাদা থাকবে।

যখন আমার ক্লায়েন্ট একটি নতুন পৃষ্ঠা তৈরি করে, আমি চাই যে তিনি সম্ভাব্য সমস্ত প্রোমো বাক্সের ড্রপডাউন তালিকার মতো কিছু থেকে প্রোমো বাক্স চয়ন করতে সক্ষম হন।

আমার কাছে মনে হচ্ছে এটি এর মতো কাজ করা উচিত:

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

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

পরামর্শ? উপরের একটি সরঞ্জাম কি আমার পক্ষে সঠিক সমাধান এবং আমাকে কেবল এটি বের করতে হবে? আমি কি এখানে কিছু মিস করছি?


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

উত্তর:


7

হিসাবে লেখক এর WPAlchemy , আমি একটি বিট পক্ষপাত আছি, কিন্তু আপনি মূলত কাজের একটি ভালো মডেল কি কখনও রুট আপনি নির্বাচন উপর নির্ভর করে অনুসরণ করার রূপরেখা আছে।

তবে, যদি ডাব্লুপিএলচেমি ব্যবহার করে থাকেন তবে আপনি মূলত নিম্নলিখিতগুলির মতো কিছু করবেন (পদক্ষেপ # 2):

//  functions.php

include_once 'WPAlchemy/MetaBox.php';

if (is_admin()) 
{
    // a custom style sheet if you want to do some fancy styling for your form
    wp_enqueue_style('custom_meta_css', TEMPLATEPATH . '/custom/meta.css');
}

// define the meta box
$custom_metabox = new WPAlchemy_MetaBox(array
(
    'id' => '_custom_meta',
    'title' => 'My Custom Meta',
    'template' => TEMPLATEPATH . '/custom/meta.php'
));

custom/meta.cssএমন স্টাইলগুলি থাকতে পারে যা আপনি নিজের ফর্মটি স্টাইল করতে পারেন এবং custom/meta.phpমূলত একটি মেটা বক্সের ফর্ম বিষয়বস্তু সহ একটি এইচটিএমএল ফাইল, এই ক্ষেত্রে আপনার ড্রপ ডাউন, আপনার ড্রপ ডাউন উত্পন্ন করতে আপনি আপনার সমস্ত কাস্টম পোস্ট পাওয়ার জন্য একটি কাস্টম ডাব্লুপি কোয়েরি করবেন ধরনের। আপনার ফর্মের উপাদান তৈরিতে সহায়তা করার জন্য ডাব্লুপিএলেচেমির কিছু বিশেষ সহায়ক ফাংশন রয়েছে।

টেমপ্লেটে কাজ করার সময় আপনাকে সহায়তা করার জন্য অতিরিক্ত ডকুমেন্টেশন রয়েছে

ডাব্লুপিএলচেমির মূল লক্ষ্য ছিল স্টাইলিং (চেহারা + অনুভূতি) থেকে শুরু করে মেটা বক্সের সামগ্রীর সংজ্ঞা পর্যন্ত বিকাশকারীদের হাতে নিয়ন্ত্রণ রাখা।

এবং আমি এবং অন্যরা যারা মন্তব্য করে এবং প্রশ্ন জিজ্ঞাসা করে তাদেরকে সর্বদা সহায়তা করতে প্রস্তুত।


1
উত্তম উত্তর, তবে আমি বিশেষভাবে পোস্ট সম্পাদনার স্ক্রিনে সেই অতিরিক্ত স্টাইলশিট অনুরোধটি হুক করার পরামর্শ দিতে পারি। মেটাবক্স তৈরির ক্ষেত্রেও একই কথা বলা যেতে পারে যে আদর্শগতভাবে do_meta_boxesকিছু শর্তযুক্ত যুক্তি দিয়ে বা বিকল্পভাবে ব্যবহার করা উচিত add_meta_boxes_{%TYPE%}..
t31os

14

হেই, তুমি নবাগত! আমরা ছিঁড়ে ফেলছি!

জে / কে :) আমরা আপনাকে পেয়ে আনন্দিত, এখানে সমস্ত নবজাতকদের আন্তরিক স্বাগত জানাই।

সুতরাং এই তৃতীয়বারের মতো আমি এই প্রয়োজনীয়তাটি শুনেছি, ক্লায়েন্টের কাছ থেকে দুবার এবং আপনার কাছ থেকে আর না (এবং আপনার ক্লায়েন্ট)) এটি আমাকে বলে যে এটি একটি যুক্তিসঙ্গত সাধারণ প্রয়োজন।

তিনটি (3) ড্রপডাউন দেখাচ্ছে ওয়ার্ডপ্রেস কাস্টম মেটাবক্স

আমি আপনার বিশ্লেষণ পছন্দ করেছি তাই আমি আপনার ২ য় পয়েন্টের জন্য একটি শ্রেণি কোড করার সিদ্ধান্ত নিয়েছি। আমি এটিকে ডাকলাম LittlePromoBoxesকারণ আমি এই গানটি কখনই আমার মাথা থেকে বের করতে পারি না , তাদের ধন্যবাদ । মূলত আমি ক্লাসটি এনপ্যাপুলেট করতে ব্যবহার করি অন্যথায় আমার যে ফাংশনগুলি লিখতে হবে তার সাথে সম্ভাব্য নামকরণের বিরোধগুলি এড়ানোর জন্য।

আপনি এই থিমটি আপনার থিমের functions.phpফাইলে বা একটি প্লাগইন এর .PHP ফাইলে রেখে দিতে পারেন যা আপনি লিখতে পারেন (তবে চিন্তা করবেন না, এটি এটি দেখতে অনেক জটিল দেখায়))

প্রথম ফাংশনটি on_load()একটি স্ট্যাটিক ফাংশন যা আমি ক্লাস ঘোষণার শেষে কল করি আপনার তিনটি (3) হুকের আরম্ভ করার জন্য (ফাই স্ট্যাটিক ফাংশনগুলি মূলত শ্রেণীর সাথে সম্পর্কিত ফাংশন , উদাহরণ নয়) :

  1. initহুক রেজিস্টার promo-boxপোস্টে ধরন,

  2. add_meta_boxes_postহুক আপনি metabox সংজ্ঞায়িত করার অনুমতি দেয়, এবং

  3. wp_insert_post_dataহুক আপনার নির্বাচিত প্রচার বক্স ক্যাপচার এবং ডাটাবেস সংরক্ষণ করতে অনুমতি দেয়।

এই হুকগুলির প্রত্যেকটি ক্লাসের আরও একটি স্থিতিশীল ফাংশন উল্লেখ করে (এগুলি ছিল ক্লাস তৈরির মাধ্যমে আমি আবদ্ধ করা ফাংশন))

আপনার প্রশ্নের উপর ভিত্তি করে কোনও পোস্ট টাইপ কীভাবে নিবন্ধ করতে হবে তা ধরে action_init()নিয়ে আমি এই ফাংশনটি এবং আমার make_labels()সহায়ক ফাংশনটি বর্ণনা করে এড়িয়ে যাব ।

action_add_meta_boxes_post()ফাংশন metabox ওয়ার্ডপ্রেস কোর ফাংশন ব্যবহার করে খাতাপত্র add_meta_box()এবং আমি তা এর পরামিতি মন্তব্য করেছি ব্যাখ্যা করতে কেন আমি পাশ কি আমি প্রত্যেকের জন্য গৃহীত। কলব্যাক ফাংশন the_little_promo_boxes_metabox()অবশ্যই শ্রেণীর আরেকটি স্থিতিশীল ফাংশন এবং এটি হ'ল মেটাবক্সে সামগ্রীটি প্রদর্শন করে। এটি প্রধানত ওয়ার্ডপ্রেস মূল ফাংশনটি wp_dropdown_pages()প্রোমো বাক্সগুলির একটি তালিকা প্রদর্শন করতে ব্যবহার করে (নোট করুন যে এটি 'পৃষ্ঠাগুলি' ছাড়াও অন্যান্য পোস্টের প্রকারগুলি প্রদর্শন করবে তবে কেবল যদি 'hierarchical'=>trueতাদের পোস্টের ধরণের নিবন্ধকরণ হিসাবে চিহ্নিত করা হয় only তবে কেবল শ্রেণিবদ্ধ কেন? কারণ তারা এইভাবেই এটি লিখেছেন, সে কারণেই! :)

যেহেতু আমরা তিনটি (3) ড্রপডাউন দেখিয়ে চলেছি আমাদের প্রত্যেককে এইচটিএমএল ( "promo_box_{$i}") তে আলাদা আলাদা আইডি দেওয়া দরকার তবে বর্গাকার বন্ধনী ( 'promo_boxes[]') সহ একই নামটি যাতে পিএইচপি তাদেরকে $_POSTভেরিয়েবলের অভ্যন্তরে অ্যারে হিসাবে সংগ্রহ করতে পারে (যা আমাদের জন্য ওয়ার্ডপ্রেস অ্যাক্সেস করে; আপনি দেখতে পাবেন কীভাবে এক মিনিটে) । এবং অবশ্যই আমাদের নির্বাচিত মান ( (empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])) নির্ধারণ করতে হবে যদি প্রকৃতপক্ষে কোনও মান আগেই নির্বাচিত হত।

get_post_type_object()পোস্টের ধরণের লেবেলগুলি কীভাবে পাবেন তা দেখানোর জন্য আমি ওয়ার্ডপ্রেস কোর ফাংশনটিও get_post_meta()ব্যবহার করেছি এবং কাস্টম ফিল্ড কী '_প্রোম_বক্সেস' ব্যবহার করে প্রোমো বাক্স আইডিগুলির একটি অ্যারের পুনরুদ্ধার করতে ওয়ার্ডপ্রেস কোর ফাংশনটি ব্যবহার করেছি যা আমি আপনাকে দেখাব পরবর্তী সংরক্ষণ করার জন্য (নোট আমি নামে একটি পূর্ববর্তী আন্ডারস্কোর ব্যবহার করেছি '_promo_boxes'যা ব্যবহারকারীর পোস্ট সম্পাদনা করার সময় ওয়ার্ডপ্রেসকে স্ট্যান্ডার্ড কাস্টম ফিল্ড ইউআই থেকে আড়াল করে

কোডটি দেখার আগে বর্ণনার শেষ ফাংশনটি হ'ল filter_wp_insert_post_data()যা প্রথম প্যারামিটারে বিদ্যমান পোস্ট ডেটা প্রাপ্ত করে ( $data) এবং $_POSTদ্বিতীয় প্যারামিটার হিসাবে ওয়ার্ডপ্রেসকে অ্যারের সামগ্রীগুলি ( ) ধন্যবাদ জানায় $postarr। এই ফাংশনের অভ্যন্তরে আমরা ওয়ার্ডপ্রেস মূল ফাংশনটি কল করি এবং অ্যারে (যেমন ) দ্বারা নির্দিষ্ট পোস্টের কীটির জন্য কাস্টম ফিল্ড মান সংরক্ষণ করতে update_post_meta()প্রোমো বাক্স অ্যারে ( $postarr['promo_boxes']) বের করি ract'_promo_boxes'$_POST$postarr['ID']

বলেছিল, এখানে LittlePromoBoxesক্লাসের কোড :

class LittlePromoBoxes {
  static function on_load() {
    add_action('init',array(__CLASS__,'action_init'));
    add_action('add_meta_boxes_post',array(__CLASS__,'action_add_meta_boxes_post'));
    add_filter('wp_insert_post_data',array(__CLASS__,'filter_wp_insert_post_data'),10,2);
  }
  static function action_init() {
    register_post_type('promo-box',array(
      'labels'          => self::make_labels('Promo Box','Promo Boxes'),
      'public_queryable'=> false,
      'hierarchical'    => true,  // IMPORTANT!!! wp_dropdown_pages() requires 'hierarchical'=>true
      'show_ui'         => true,
      'query_var'       => false,
      'supports'        => array('title','editor','thumbnail','custom-fields'),
      'show_in_nav_menus'=>true,
      'exclude_from_search'=>true,
    ));
  }
  static function make_labels($singular,$plural=false,$args=array()) {
    if ($plural===false)
      $plural = $singular . 's';
    elseif ($plural===true)
      $plural = $singular;
    $defaults = array(
      'name'              =>_x($plural,'post type general name'),
      'singular_name'      =>_x($singular,'post type singular name'),
      'add_new'            =>_x('Add New',$singular),
      'add_new_item'      =>__("Add New $singular"),
      'edit_item'          =>__("Edit $singular"),
      'new_item'          =>__("New $singular"),
      'view_item'          =>__("View $singular"),
      'search_items'      =>__("Search $plural"),
      'not_found'          =>__("No $plural Found"),
      'not_found_in_trash'=>__("No $plural Found in Trash"),
      'parent_item_colon' =>'',
    );
    return wp_parse_args($args,$defaults);
  }
  static function action_add_meta_boxes_post($post) {
    add_meta_box(
      'little-promo-boxes',   // Metabox Name, used as the "id" for a wrapping div
      'Little Promo Boxes',   // Metabox Title, visible to the user
      array(__CLASS__,'the_little_promo_boxes_metabox'), // Callback function
      'post',                 // Add to the Edit screen for Post Types of 'post'  
      'side',                 // Show it in the sidebar (if center then it would be 'normal'
      'low'                   // Show it below metaboxes that specify 'high'
    );
  }
  static function the_little_promo_boxes_metabox($post) {
    $pto = get_post_type_object('promo-box');
    $default_options = array(
      'post_type' => 'promo-box',
      'show_option_none' => "Select a {$pto->labels->singular_name}",
    );
    $promo_boxes = get_post_meta($post->ID,'_promo_boxes',true);
    for($i=0; $i<=2; $i++) {
      wp_dropdown_pages(array_merge($default_options,array(
        'id'       => "promo_box_{$i}",
        'name'     => 'promo_boxes[]',
        'selected' => (empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i]),
      )));
    }
  }
  static function filter_wp_insert_post_data($data, $postarr) {
    update_post_meta($postarr['ID'],'_promo_boxes',$postarr['promo_boxes']);
    return $data;
  }
  static function get_promo_boxes($post=false) {
    static $promo_boxes=array();
    if (!$post)
      $post = $GLOBALS['post'];
    if (!isset($promo_boxes[$post->ID])) {
      $promo_boxes[$post->ID] = get_post_meta($post->ID,'_promo_boxes',true);
      $index = 0;
      foreach($promo_boxes[$post->ID] as $promo_box_id) {
        $promo_boxes[$post->ID][$index++] = (is_numeric($promo_box_id) ? get_post($promo_box_id) : false);
      }
    }
    return $promo_boxes[$post->ID];
  }
  static function get_promo_box($number,$post=false) {
    $promo_boxes = self::get_promo_boxes($post);
    return $promo_boxes[$number-1];
  }
}
LittlePromoBoxes::on_load();

এখনও দুটি (2) স্থির ফাংশন এখনও উল্লেখ করা হয়নি: get_promo_boxes()এবং get_promo_box(); এইগুলি post_type='promo-box'তাদের সাধারণ সংখ্যা ১.৩ দ্বারা পোস্টগুলি পুনরুদ্ধারে আপনাকে সহায়তা করার জন্য সহায়তাকারী ফাংশন । তবে তাদের এখানে আরও ওয়ার্ডপ্রেস তৈরি করার জন্য আপনার থিমের functions.phpফাইলটিতে যুক্ত করার জন্য দুটি র‍্যাপার ফাংশন রয়েছে (নোট করুন যে আপনি কোনও পোস্ট প্যারামিটার হিসাবে পাস করতে পারবেন তবে আপনি লুপের যে কোনও আলাদা পোস্ট ব্যবহার না করে তা করতে হবে না ) :

function get_little_promo_boxes($post=false) {
  return LittlePromoBoxes::get_promo_boxes($post);
}
function get_little_promo_box($number,$post=false) {
  return LittlePromoBoxes::get_promo_box($number,$post);
}

এখন আপনি আপনার single.phpথিম ফাইলে এই দুটি বা দুটি ফাংশনই কোড সহ কল করতে পারেন যা দেখতে এই জাতীয় দেখতে পারে (এই কোডটি কোনও লুপে লেখা যেতে পারে তবে বেশিরভাগ ওয়ার্ডপ্রেস থিমরা কোডকে নকল করতে পছন্দ করে বলে মনে হয় তারা অপ্রয়োজনীয়তা দূর করার পরিবর্তে এটি পড়তে পারে) সুতরাং, যখন রোমে ...):

<?php
  $promo_boxes = get_little_promo_boxes();
  if (isset($promo_boxes[1]))
    echo '<div id="promo-box1" class="promo-box">' . get_the_title($promo_boxes[1]->ID) . '</div>';
  if (isset($promo_boxes[2]))
    echo '<div id="promo-box2" class="promo-box">' . get_the_title($promo_boxes[2]->ID) . '</div>';
  if (isset($promo_boxes[3]))
    echo '<div id="promo-box3" class="promo-box">' . get_the_title($promo_boxes[3]->ID) . '</div>';
?>

1
আপনি আপনার উত্তরগুলি দিয়ে আমাকে আশ্চর্য করে তুলতে কখনও বিরত হন না, কোডটি তৈরি করতে এবং প্রতিটি পদক্ষেপটি ব্যাখ্যা করার জন্য আপনি যে প্রচেষ্টাটি চালিয়ে যান .. দুর্দান্ত!
t31os

1
@ t31os - ধন্যবাদ! আমি যখন উত্তর দেওয়া শুরু করি তখন আমি নিজেকে থামাতে পারি না। অবসেসিভ / বাধ্যতামূলক আমি অনুমান করি। তবে কমপক্ষে আমি ভাল ব্যবহার করছি!
মাইকস্কিঙ্কেল

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