ওয়ার্ডপ্রেসে কোনও পুরানো তারিখ নির্বাচন করতে অক্ষম


13

আমি কোনও পোস্টের জন্য 1899 এর নীচে বছরটি সেট করতে অক্ষম। আমি যদি ১৮৯৯ এর নীচে বছর সেট করি তবে এটি স্বয়ংক্রিয়ভাবে বর্তমান বছরে সেট করা আছে।

স্ক্রিন শট

আমি টাইমলাইন থিমটি কিনেছি এবং তাদের সমর্থন ফোরামে জিজ্ঞাসা করেছি। তারা জবাব দিল:

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


2
এবং আপনার প্রশ্ন ঠিক কি? হাজার হাজার থিম রয়েছে - আপনি যে থিমটি কিনেছেন তা যে কেউ জানতে পারবে তা ধরে নিতে এটি দীর্ঘ শট। আপনাকে কমপক্ষে প্রাসঙ্গিক কোড সরবরাহ করতে হবে।
জোহানেস পিল

1
আমি সন্দেহ করি এটি হোস্টারের দোষ। আমি ধরে নিই এটি ডাটাবেজে সংরক্ষিত একটি মান সম্পর্কে। WP_DEBUGআপনার প্রশ্নের মধ্যে একটি ত্রুটি বার্তা চালু করুন এবং সম্পাদনা করুন। আমি এটি সম্ভবত এটির মতোই করে দেখিয়েছি তবে প্রশ্নে থাকা থিমের একটি ওয়ার্কিং সংস্করণের লিঙ্ক আসলেই খুব বেশি সহায়তা করছে না।
জোহানেস পিল

1
এটি একটি বৈধ প্রশ্ন। এটি থিমের সাথে সম্পর্কিত নয়। আমি এই সমস্যাটি পুনরুত্পাদন করতে পারি। দেখুন এই অ্যানিমেটেড স্ক্রিন শট
ফুসিয়া

1
1900 এবং 1901 এর সাথে একই সমস্যা তবে 1902 কাজ করে ;-)
বার্জায়ার

1
আমি ইউনিক্স টাইমস্ট্যাম্প রেঞ্জ (2038) এর উপরের সমস্যাগুলিও এর মাধ্যমে পুনরুত্পাদন করতে পারি। পিএইচপি 5.4 উইন 7x64
রাস্ট

উত্তর:


10

এটি সত্যই কোনও উত্তর নয়, এই সমস্যার নির্দিষ্ট প্রসঙ্গে অনুসন্ধানের চেষ্টা find দয়া করে আপনার সাইটে নিম্নলিখিত প্লাগইনটি ইনস্টল করুন, তিনটি তারিখ নির্ধারণ করার চেষ্টা করুন এবং <pre>নীচের সারণিতে দ্বিতীয়টি আপনার ফলাফল যুক্ত করুন ।

/* Plugin Name: WPSE Sysinfo */
add_action( 'admin_footer', 'wpse_sysinfo' );
function wpse_sysinfo() {

    $bit         = 4 === PHP_INT_SIZE ? 32 : 64; // PHP version, not OS!
    $php_version = PHP_VERSION;
    $db_version  = $GLOBALS['wpdb']->db_version();

    print "<pre>$bit | $php_version | $db_version</pre>";
}

প্লাগিনের সংক্ষিপ্ততা এখানে চেক আউট করা যেতে পারে

ওএস | ওএস বিট | পিএইচপি | পিএইচপি বিট | মাইএসকিউএল | 999 | 1899 | 2020 | 2039 | ব্যবহারকারী
WIN7 | 64 | 5.4.4 | ?? | 5.5.25 | ✘ | ✘ | ✔ | ✘ | toscho
লিনাক্স | ?? | 5.3.18-এনএমএম 1 | ?? | 5.1.70 | ✔ | ✔ | ✔ | ✔ | toscho
সেন্টস 6 | 64 | 5.5.4 | ?? | 5.0.95 | ✔ | ✔ | ✔ | ✔ | toscho
WIN7 | 64 | 5.4.15 | 32 | 5.5.31 | ✘ | ✘ | ✔ | ✘ | rarst
উবুন্টু 12.04 | 64 | 5.3.10-1 | 64 | 5.5.32 | ✔ | ✔ | ✔ | ✔ | পিলি
ক্লাউডলিনাক্স | 64 | 5.2.17 | 64 | 5.0.96 | ✔ | ✔ | ✔ | ✔ | পিলি
উবুন্টু 12.10 | 64 | 5.4.6 | 64 | 5.5.32 | ✔ | ✔ | ✔ | ✔ | মাইকেল একলন্ড
সেন্টস 5.9 | 32 | 5.3.27 | 32 | 5.5.32 | ✘ | ✘ | ✔ | ✘ | মাইকেল একলন্ড
WIN7 | 64 | 5.4.7 | 64 | 5.5.27 | ✘ | ✘ | ✔ | ✘ | সম্রাট্
ওএসএক্স 10.7.5 | 64 | 5.3.6 | 64 | 5.5.9 | ✔ | ✔ | ✔ | ✔ | GhostToast
সেন্টোস 6.4 | 64 | 5.4.17 | 32 | 5.1.59 | ✘ | ✘ | ✔ | ✘ | birgire
দেবিয়ান 6 | 64 | 5.4.19 | 64 | 5.1.66 | ✘ | ✘ | ✔ | ✘ | birgire
WIN7 | 64 | 5.5.0 | 64 | 5.5.22 | ✘ | ✘ | ✔ | ✘ | জিএম
ওএসএক্স 10.7.4 | 64 | 5.3.6 | 64 | 5.5.9 | ✔ | ✔ | ✔ | ✔ | brasofilo
সেন্টস 5 | 64 | 5.3.22 | 64 | 5.1.68 | ✔ | ✔ | ✔ | ✔ | brasofilo
ম্যাক 10.8.5 | 64 | 5.3.26 | 64 | 5.5.25 | ✔ | ✔ | ✔ | ✔ | flentini
WIN7 | 64 | 5.3.27 | 64 | 5.5.31 | ✔ | ✔ | ✔ | ✔ | সাসচা ক্রাউস
Win7SP1 | 64 | 5.3.8 | 64 | 5.5.28 | ✔ | ✔ | ✔ | ✔ | ম্যানুয়েল সাইচোল্ড
  1. একটি নতুন পোস্ট তৈরি করুন। এটি সংরক্ষণ করুন.
  2. তারিখটি জানুয়ারীতে সেট করুন। 1 লা, আপডেট0999 ক্লিক করুন । এটি সংরক্ষণ করা বা বর্তমান তারিখে পরিবর্তন করা হয়েছে?
  3. তারিখ সেটিংসের জন্য একই পদ্ধতি পুনরাবৃত্তি করুন 1899, 2020এবং 2039
  4. আপনার অ্যাডমিন ফুটারে প্লাগইন আউটপুট থেকে তথ্য নিন এবং টেবিলটি আপডেট করুন।

7

প্রশ্ন এবং প্রত্যাশা

যদিও এই প্রশ্নের আক্ষরিক রূপটি প্রসঙ্গে (1899 সাল) ব্যবহারিক, তাত্ত্বিক দিক থেকে এটি কিছুটা অস্পষ্ট। বয়স কত? অতীতের কতদূর আমরা যেতে চাই ? ভবিষ্যতের কি হবে?

ওয়ার্ডপ্রেস সাল থেকে, ইঞ্জিন ব্লগিং যে হিসেবে শুরু করেছে প্রাসঙ্গিক ইন্দ্রিয় নিম্নোক্ত সময় বিঘত হ্যান্ডেল করতে প্রসূত:

  • ডাব্লুপি বিদ্যমান ছিল (স্পষ্টত এটি ব্যবহার করতে সক্ষম হবে)
  • সম্ভাব্য historicalতিহাসিক পোস্টগুলির ব্যাপ্তি (ইন্টারনেটের অস্তিত্বের মতোই স্পষ্টভাবে পিছনে)
  • ভবিষ্যতে যতদূর সম্ভব বিশেষ প্রচেষ্টা ব্যতীত (এটি বিরতি না হওয়া পর্যন্ত কাজ করুন)

ওয়ার্ডপ্রেস ব্যবহার নন-ব্লগিং অ্যাপ্লিকেশনগুলিতে বিকশিত হওয়ার সাথে সাথে এই জাতীয় প্রকল্পগুলির (সাধারণত ইতিহাস এবং শিল্প হিসাবে আমি প্রতিবেদন থেকে দেখেছি) এই স্প্যানের বাইরে তারিখগুলি সহ বিভিন্ন ধরণের সমস্যাগুলি আঘাত করা শুরু করে।

আমার গবেষণার উদ্দেশ্যে আমি নিম্নলিখিত প্রশ্নগুলি তৈরি করেছিলাম:

  1. দুটি প্রাচীন ও সর্বশেষ পূর্ণ ক্যালেন্ডার বছর কী, যা ওয়ার্ডপ্রেস পোস্টের তারিখগুলি দেশীয় এবং নির্ভরযোগ্যতার সাথে ব্যবহার করা যেতে পারে?
  2. দেশীয় সীমা ছাড়িয়ে উপলব্ধ স্প্যান বাড়ানোর জন্য কম ঝুলন্ত ফলগুলি (যদি থাকে) কী কী?

প্ল্যাটফর্মের সীমাবদ্ধতা

যেহেতু ওয়ার্ডপ্রেস পিএইচপি অ্যাপ্লিকেশন এবং ডেটা সংরক্ষণের জন্য মাইএসকিউএল ব্যবহার করে এটি তাদের সীমাবদ্ধতার সাপেক্ষে।

মাইএসকিউএল

ওয়ার্ডপ্রেস মাইএসকিউএল টাইপের post_dateকলামে পোস্টের তারিখগুলি সঞ্চয় করে DATETIME

ডকুমেন্টেশন অনুসারে এই ধরণের 1000 থেকে 9999 বছর সমর্থন করে :

DATETIMEটাইপ মান উভয় তারিখ এবং সময় অংশ থাকে জন্য ব্যবহৃত হয়। মাইএসকিউএল পুনরুদ্ধার করে এবং ফর্ম্যাটে DATETIMEমান প্রদর্শন 'YYYY-MM-DD HH:MM:SS'করে। সমর্থিত পরিসর '1000-01-01 00:00:00'থেকে '9999-12-31 23:59:59'

তবে এটি আরও বলে যে পূর্বের মানগুলি কার্যকর হতে পারে , পরবর্তী মানগুলির কোনও উল্লেখ নেই:

জন্য DATE and DATETIMEপরিসীমা বিবরণ, মানে যদিও তার আগে মান কাজ করতে পারে, কোন গ্যারান্টি নেই যে, "সমর্থিত"।

বৌদ্ধিকভাবে আমি মানদণ্ডের পরিসীমা ছাড়াই পর্যবেক্ষণ করেছি, এটি কৌতুকপূর্ণ এবং আমাদের নির্ভরযোগ্যতার শর্তের বাইরে।

পিএইচপি

পিএইচপি প্রোগ্রামিংয়ে ইউনিক্সের টাইমস্ট্যাম্পের তারিখের উপস্থাপনা ব্যাপকভাবে ব্যবহৃত হয়। আমাদের উদ্দেশ্যে ডকুমেন্টেশন অনুসারে (পিএইচপি 5.2+ এবং জেনেরিক 32 বিট পরিবেশ) এটি বছরগুলিকে সমর্থন করে (সম্পূর্ণ) 1902 থেকে 2037 :

একটি টাইমস্ট্যাম্পের বৈধ পরিসীমা সাধারণত থেকে Fri, 13 Dec 1901 20:45:54 UTCথাকে Tue, 19 Jan 2038 03:14:07 UTC। (এটি সেই তারিখগুলি যা 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার জন্য সর্বনিম্ন এবং সর্বাধিক মানগুলির সাথে সামঞ্জস্য করে Additionally) অতিরিক্তভাবে, সমস্ত প্ল্যাটফর্মগুলি নেতিবাচক টাইমস্ট্যাম্পগুলিকে সমর্থন করে না, সুতরাং আপনার তারিখের সীমাটি ইউনিক্স পর্বের চেয়ে আগের কোনও সীমাবদ্ধ নয়। এর অর্থ হ'ল উদাহরণস্বরূপ তারিখগুলি Jan 1, 1970উইন্ডোজ, কিছু লিনাক্স বিতরণ এবং কয়েকটি অন্যান্য অপারেটিং সিস্টেমে কাজ করবে না। পিএইচপি 5.1.0 এবং আরও নতুন সংস্করণগুলি এই সীমাবদ্ধতাটি অতিক্রম করেছে।

নতুন Date/Timeভিত্তিক হ্যান্ডলিং ব্যতীত bit৪ বিট এবং এটির পরিমাণ প্রায় -২২২ বিলিয়ন থেকে ২৯২ বিলিয়ন বছর , যা সম্ভবত এই সময়ে মানবতার প্রয়োজনের চেয়ে বেশি।

ওয়ার্ডপ্রেস সীমাবদ্ধতা

ওয়ার্ডপ্রেস এর কোড বেসে কিছু অতিরিক্ত সীমাবদ্ধতার পরিচয় দেয় এবং উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

তথ্য প্রবাহ

প্রাথমিক ব্যবহারকারী কার্যপ্রবাহের দৃষ্টিকোণ থেকে তারিখ সম্পর্কিত দুটি প্রক্রিয়াজাতকরণ রয়েছে:

  • পোস্ট সম্পাদনা ফর্মের তারিখ ইনপুটটি সঠিকভাবে প্রক্রিয়া করা উচিত এবং ডাটাবেসে সংরক্ষণ করতে হবে
  • ডাটাবেসে সংরক্ষণের তারিখটি সঠিকভাবে পড়তে হবে এবং ইন্টারফেসে প্রদর্শিত হবে

নোট করুন যে এগুলি প্রযুক্তিগতভাবে সম্পূর্ণ পৃথক এবং স্বতন্ত্র প্রক্রিয়া। যেমন আরও ব্যাখ্যা করা হয়েছে তাদের রেঞ্জগুলি ওভারল্যাপ হয় না এবং সঠিক তারিখটি সংরক্ষণ করে ওয়ার্ডপ্রেস পরিবেশে এটি সঠিকভাবে পড়ার সামর্থ্য নয়।

স্পষ্ট সীমা

  • অ্যাডমিনে ওয়ার্ডপ্রেস পোস্ট সম্পাদক বছরের বিভিন্ন সময়কে মঞ্জুরি দেয়, যেটি পোস্টের তারিখ হিসাবে 100 থেকে 9999 পর্যন্ত জমা দেওয়া যায়
  • _wp_translate_postdata() প্রক্রিয়া বছর (ফর্ম থেকে স্বতন্ত্র সংখ্যা হিসাবে জমা দেওয়া) এবং:
    • এটি অ-নেতিবাচক > 0 এ সংক্রামিত করে
    • এটি ব্যবহার করে যাচাই করে wp_checkdate(), যা পিএইচপি নেটিভ কল করে , যা 1 থেকে 32767checkdate() সীমাবদ্ধ করে

অন্তর্নিহিত সীমা

  • strtotime()পিএইচপি ফাংশন একাধিকবার ব্যবহৃত হয় এবং উপরে উল্লিখিত ইউনিক্স টাইমস্ট্যাম্পের সাপেক্ষে, সর্বনিম্ন স্তরে এটি mysql2date()ডাটাবেস থেকে সমস্ত তারিখের পাঠকে প্রভাবিত করে, ১৯০২ থেকে ২০3737 অবধি উত্তরাধিকার সূত্রে প্রাপ্ত
  • ওয়ার্ডপ্রেস নিয়মিত প্রকাশের তারিখ পার্সিংয়ের জন্য ফিরে আসে get_gmt_from_date(), যা বছর হওয়ার প্রত্যাশা করে ([0-9]{1,4}), এটি 1 থেকে 9999 সীমাবদ্ধ করে , অন্যান্য কার্যগুলিতে অনুরূপ প্রক্রিয়াকরণের প্রবল সম্ভাবনা যার জন্য আরও পুঙ্খানুপুঙ্খ কোড অডিট প্রয়োজন হবে

কার্যক্ষেত্রের সম্ভাবনা

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

উপসংহার

ব্যবহারিক উদ্দেশ্যে এবং ডেটা বহনযোগ্যতার ডেটা ওয়ার্ডপ্রেস পোস্ট তারিখের পরিসীমা 32 বিট ইউনিক্স টাইমস্ট্যাম্পের সমান বলে মনে হয় এবং এতে 1902 থেকে 2037 বছর অন্তর্ভুক্ত রয়েছে

এই পরিসীমা পরিবেশের বাইরে পোস্টের কোনও অপারেশনের জন্য নিরীক্ষণ করতে হবে (ইউনিক্স টাইমস্ট্যাম্পগুলির 64 বিট পরিসর, মাইএসকিউএল ডি-ফ্যাক্টো কার্যকারিতা বা মানগুলির জন্য বিকল্প ডাটাবেস স্টোরেজ)। আরও সীমার জন্য ( 1000 এর নীচে, 9999 এর উপরে ) কাস্টম কোডের যথেষ্ট পরিমাণের প্রয়োজন হতে পারে।

যথেচ্ছ তারিখগুলির যে কোনও প্রয়োগের জন্য তা বোঝা যায়:

  • এগুলি মাইএসকিউএলে সংরক্ষণ করুন ডাটাবেসের সীমাবদ্ধতার সাপেক্ষে format
  • পিএইচপি-তে সম্পূর্ণ কাস্টম- Date/Timeভিত্তিক কোড এবং / অথবা ওয়ার্ডপ্রেস ফাংশন ব্যবহার করে ইউনিক্স টাইমস্ট্যাম্প সীমা দ্বারা প্রভাবিত না হওয়ার নিরীক্ষণ করা হয়

কোড টেস্ট বিছানা

নীচের কোডগুলি এবং বছরের পর বছর ধরে নির্বাচিত সেটগুলি উপরের গবেষণা এবং উপসংহারের পরীক্ষার জন্য ব্যবহৃত হয়েছে:

require ABSPATH . '/wp-admin/includes/post.php';

$timestamp_size_info = array(
    'PHP_INT_SIZE'   => PHP_INT_SIZE,
    'PHP_INT_MAX'    => number_format( PHP_INT_MAX ),
    'min timestamp'  => date( DATE_ISO8601, - PHP_INT_MAX ),
    'zero timestamp' => date( DATE_ISO8601, 0 ),
    'max timestamp'  => date( DATE_ISO8601, PHP_INT_MAX ),
);

r( $timestamp_size_info );

// hand picked set of years to test for assorted limits
$years = array(
    'negative'           => - 1,
    'zero'               => 0,
    'one'                => 1,
    'wp min'             => 100,
    'mysql first'        => 1000,
    'before unix'        => 1899,
    'unix first'         => 1902,
    'current'            => 2013,
    'unix last'          => 2037,
    'after unix'         => 2039,
    'mysql last, wp max' => 9999,
    'after checkdate'    => 33000,
);

// simulates form submission data
$post = array(
    'post_type' => 'post', // shut notice
    'edit_date' => 1,
    'aa'        => 1,
    'mm'        => '01',
    'jj'        => '01',
    'hh'        => '00',
    'mn'        => '00',
    'ss'        => '00',
);

// add_filter( 'wp_checkdate', '__return_true' );

foreach ( $years as $name => $year ) {

    $post['aa'] = $year;
    $translated = _wp_translate_postdata( false, $post );

    if ( is_wp_error( $translated ) ) { // wp_checkdate() failed
        r( array( 'year' => $year . " ({$name})", 'translated valid' => false ) );
    }
    else {

        $post_date        = $translated['post_date'];
        $post_date_gmt    = $translated['post_date_gmt'];
        $translated_valid = (string) $year == substr( $post_date, 0, strpos( $post_date, '-' ) );
        $mysql2date       = mysql2date( DATE_ISO8601, $post_date );
        $mysql2date_valid = (string) $year == substr( $mysql2date, 0, strpos( $mysql2date, '-' ) );

        r( array(
            'year'             => $year . " ({$name})",
            'post_date'        => $post_date,
            'translated valid' => $translated_valid,
            'post_date_gmt'    => $post_date_gmt,
            'mysql2date'       => $mysql2date,
            'from sql valid'   => $mysql2date_valid,
        ) );
    }
}

+1 কেবলমাত্র প্রশ্ন বাকি: কী r()?
কায়সার

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