WordPress में एक पुरानी तारीख का चयन करने में असमर्थ


13

मैं पोस्ट के लिए 1899 से नीचे का वर्ष निर्धारित करने में असमर्थ हूं। अगर मैं 1899 से नीचे का वर्ष निर्धारित करता हूं तो यह वर्तमान वर्ष के लिए स्वचालित रूप से सेट हो जाता है।

स्क्रीन शॉट

मैंने टाइमलाइन थीम खरीदी है और उनके सपोर्ट फोरम में पूछा है। उन्होंने उत्तर दिया:

यह आपके होस्टिंग प्रदाता द्वारा बनाई गई सीमा की तरह लगता है। थीम में कुछ भी आपके द्वारा असाइन की गई तारीख को नहीं रोक रहा है - जैसा कि आप देख सकते हैं, डेमो में 1400 के दशक में तारीखों का उपयोग करने वाले पोस्ट हैं। अपने होस्टिंग प्रदाता से संपर्क करने की कोशिश करें और देखें कि क्या उनके पास इस बात पर कोई अंतर्दृष्टि है कि कैसे पता करें।


2
और आपका सवाल है कि वास्तव में क्या है? वहाँ विषय के हजारों वहाँ है - यह किसी को लगता है कि आप खरीदा विषय के बारे में पता होगा एक लंबा शॉट है। आपको कम से कम प्रासंगिक कोड प्रदान करना होगा।
जोहान्स पाइल

1
मुझे संदेह है कि यह हॉस्टल की गलती है। यह डेटाबेस में सहेजे गए मान के बारे में है, मुझे लगता है। WP_DEBUGअपने प्रश्न में एक त्रुटि संदेश चालू करें और संपादित करें। मैंने इसे ऐसा प्रतीत किया हो सकता है, लेकिन वास्तव में इस विषय के काम करने वाले संस्करण के लिए एक लिंक वास्तव में बहुत मददगार नहीं है।
जोहान्स पाइल

1
यह एक कानूनी सवाल है। यह विषय से संबंधित नहीं है। मैं इस समस्या को पुन: पेश कर सकता हूं। देखें इस एनिमेटेड स्क्रीन शॉट
FUXIA

1
1900 और 1901 की समान समस्या, लेकिन 1902 में काम करता है; ;-)
बीरगेयर

1
मैं इसे पुन: प्रस्तुत कर सकता हूं, जिस तरह से यूनिक्स टाइमस्टैम्प रेंज (2038) के ऊपर भी मुद्दे हैं। Win7x64 पर PHP 5.4
Rarst

जवाबों:


10

यह वास्तव में एक जवाब नहीं है, बस इस समस्या के लिए विशिष्ट संदर्भ खोजने का प्रयास है। कृपया अपनी साइट पर निम्नलिखित प्लगइन स्थापित करें, तीन तिथियों को सेट करने का प्रयास करें और अपना परिणाम <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>";
}

प्लग इन की जाँच यहाँ से की जा सकती है

ओएस | OS बिट | PHP | PHP बिट | MySQL | 999 | 1899 | 2020 | 2039 | उपयोगकर्ता
जीत 7 | 64 | 5.4.4 | ?? | 5.5.25 | ✘ | ✘ | ✔ | ✘ | toscho
लिनक्स | ?? | 5.3.18-nmm1 | ?? | 5.1.70 | ✔ | ✔ | ✔ | ✔ | toscho
सेंटोस 6 | 64 | 5.5.4 | ?? | 5.0.95 | ✔ | ✔ | ✔ | ✔ | toscho
जीत 7 | 64 | 5.4.15 | 32 | 5.5.31 | ✘ | ✘ | ✔ | ✘ | rarst
उबुन्टु 12.04 | 64 | 5.3.10-1 | 64 | 5.5.32 | ✔ | ✔ | ✔ | ✔ | Pille
CloudLinux | 64 | 5.2.17 | 64 | 5.0.96 | ✔ | ✔ | ✔ | ✔ | Pille
उबंटू 12.10 | 64 | 5.4.6 | 64 | 5.5.32 | ✔ | ✔ | ✔ | ✔ | माइकल Ecklund
CENTOS 5.9 | 32 | 5.3.27 | 32 | 5.5.32 | ✘ | ✘ | ✔ | ✘ | माइकल Ecklund
जीत 7 | 64 | 5.4.7 | 64 | 5.5.27 | ✘ | ✘ | ✔ | ✘ | कैसर
OSX 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
जीत 7 | 64 | 5.5.0 | 64 | 5.5.22 | ✘ | ✘ | ✔ | ✘ | जीएम
OSX 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
जीत 7 | 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) में व्यावहारिक है, यह सैद्धांतिक अर्थों में थोड़ा अस्पष्ट है। कितना पुराना है? अतीत में हम कितनी दूर जाना चाहते हैं? भविष्य के बारे में क्या विचार है?

चूंकि वर्डप्रेस ब्लॉगिंग इंजन के रूप में शुरू हुआ था, उस संदर्भ में यह समय की अवधि के बाद संभालने के लिए विकसित हुआ:

  • WP मौजूद थी (स्पष्ट रूप से इसका उपयोग करने में सक्षम होने के लिए)
  • संभावित ऐतिहासिक पदों की सीमा (स्पष्ट रूप से जहां तक ​​इंटरनेट मौजूद है)
  • विशेष प्रयास के बिना भविष्य में जितना संभव हो सके (काम जब तक यह टूट न जाए)

जैसे-जैसे वर्डप्रेस का उपयोग गैर-ब्लॉगिंग अनुप्रयोगों में विकसित हुआ, इस तरह की परियोजनाओं (आमतौर पर इतिहास और कला जैसा कि मैंने रिपोर्ट से देखा है) ने इस अवधि के बाहर तारीखों के साथ मिश्रित मुद्दों को हिट करना शुरू कर दिया।

अपने शोध के उद्देश्य से मैंने निम्नलिखित प्रश्नों को तैयार किया था:

  1. दो शुरुआती और नवीनतम पूर्ण कैलेंडर वर्ष क्या हैं, जिनका उपयोग वर्डप्रेस पोस्ट के साथ देशी और मज़बूती से किया जा सकता है?
  2. देशी रेंज से परे उपलब्ध स्पैन का विस्तार करने के लिए कम लटके फल (यदि हो तो) क्या हैं?

प्लेटफ़ॉर्म सीमाएँ

चूंकि वर्डप्रेस PHP एप्लिकेशन है और डेटा भंडारण के लिए MySQL का उपयोग करता है यह उनकी सीमाओं के अधीन है।

माई एसक्यूएल

वर्डप्रेस MySQL में टाइप के post_dateकॉलम में तारीखों को संग्रहीत करता है DATETIME

प्रलेखन के अनुसार यह प्रकार 1000 से 9999 वर्षों का समर्थन करता है :

DATETIMEप्रकार मान है कि दोनों की तारीख और समय भागों को शामिल करने के लिए प्रयोग किया जाता है। MySQL प्रारूप DATETIMEमें मानों को पुनः प्राप्त करता है और प्रदर्शित करता है 'YYYY-MM-DD HH:MM:SS'। समर्थित सीमा है '1000-01-01 00:00:00'करने के लिए '9999-12-31 23:59:59'

हालाँकि यह भी कहता है कि पहले के मान काम कर सकते हैं, बाद के मूल्यों का कोई उल्लेख नहीं:

के लिए DATE and DATETIMEसीमा वर्णन, साधन हालांकि पहले मूल्यों काम हो सकता है, वहाँ कोई गारंटी नहीं है कि "समर्थित"।

जबकि आनुभविक रूप से मैंने मानों को सीमा से बाहर काम करते हुए देखा है, यह एक महत्वपूर्ण और हमारी विश्वसनीयता की स्थिति से बाहर है।

पीएचपी

PHP प्रोग्रामिंग में यूनिक्स टाइमस्टैम्प का प्रतिनिधित्व तिथि का व्यापक रूप से उपयोग किया जाता है। हमारे उद्देश्यों के लिए प्रलेखन के अनुसार (PHP 5.2+ और सामान्य 32 बिट वातावरण) यह वर्ष (पूर्ण रूप से) 1902 से 2037 तक समर्थन करता है :

टाइमस्टैम्प की वैध सीमा आमतौर पर से Fri, 13 Dec 1901 20:45:54 UTCहै Tue, 19 Jan 2038 03:14:07 UTC। (ये वे तिथियां हैं जो 32-बिट हस्ताक्षरित पूर्णांक के लिए न्यूनतम और अधिकतम मानों के अनुरूप हैं।) इसके अतिरिक्त, सभी प्लेटफ़ॉर्म नकारात्मक टाइमस्टैम्प का समर्थन नहीं करते हैं, इसलिए आपकी तिथि सीमा यूनिक्स युग से पहले नहीं तक सीमित हो सकती है। इसका मतलब यह है कि उदाहरण के लिए दिनांक से पहले Jan 1, 1970विंडोज, कुछ लिनक्स वितरण और कुछ अन्य ऑपरेटिंग सिस्टम पर काम नहीं करेगा। PHP 5.1.0 और नए संस्करणों ने हालांकि इस सीमा को पार कर लिया है।

इसके अलावा नया Date/Timeआधारित हैंडलिंग 64 बिट का है और लगभग -292 बिलियन से लेकर 292 बिलियन वर्ष तक का है , जो इस समय शायद मानवता की ज़रूरतों को पार कर गया है।

वर्डप्रेस सीमाएँ

वर्डप्रेस अपने कोड बेस में कुछ अतिरिक्त सीमा का परिचय और विरासत में देता है।

डाटा प्रवाह

बुनियादी उपयोगकर्ता वर्कफ़्लो के दृष्टिकोण से दिनांक से संबंधित दो संसाधित हैं:

  • पोस्ट एडिट फॉर्म में तारीख इनपुट को सही ढंग से संसाधित किया जाना चाहिए और डेटाबेस में सहेजा जाना चाहिए
  • डेटाबेस में सहेजी गई तारीख को सही ढंग से पढ़ा जाना चाहिए और इंटरफ़ेस में दिखाया जाना चाहिए

ध्यान दें कि ये तकनीकी रूप से पूरी तरह से अलग और स्वतंत्र प्रक्रियाएं हैं। जैसा कि आगे बताया गया है कि उनकी सीमाएँ ओवरलैप नहीं होती हैं और सही तिथि को बचाने से वर्डप्रेस वातावरण में इसे सही ढंग से पढ़ने की समान क्षमता नहीं है।

स्पष्ट सीमा

  • व्यवस्थापक में वर्डप्रेस पोस्ट संपादक वर्षों की सीमा की अनुमति देता है, जिसे पोस्ट की तारीख, 100 से 9999 के रूप में प्रस्तुत किया जा सकता है
  • _wp_translate_postdata() प्रक्रिया वर्ष (फार्म से अलग संख्या के रूप में प्रस्तुत) और:
    • इसे गैर-नकारात्मक > 0 के लिए पवित्रा करता है
    • इसका उपयोग करके मान्य करता है wp_checkdate(), जो PHP को देशी कहता है checkdate(), जो 1 से 32767 की सीमा लगाता है

सीमित सीमाएँ

  • strtotime()PHP फ़ंक्शन कई बार उपयोग किया जाता है और ऊपर वर्णित यूनिक्स टाइमस्टैम्प के अधीन mysql2date()होता है, जो डेटाबेस से 1908 से 2037 की श्रेणी में विरासत में मिली तारीखों के सभी रीड को प्रभावित करता है।
  • वर्डप्रेस नियमित रूप से दिनांक पार्सिंग के लिए नियमित अभिव्यक्ति पर वापस आ जाता है get_gmt_from_date(), जो वर्ष होने की उम्मीद करता है ([0-9]{1,4}), इसे 1 से 9999 तक सीमित करता है , अन्य कार्यों में समान प्रसंस्करण की मजबूत संभावना है जो कि अधिक गहन कोड ऑडिट की आवश्यकता होगी।

वर्कअराउंड की संभावना

  • wp_checkdate()है wp_checkdateफिल्टर, जो इस सत्यापन जाँच ओवरराइड करने देता है
  • एंड-यूज़र के उद्देश्य से किया जाने वाला आउटपुट फ़िल्टर के माध्यम से date_i18n()होता है date_i18n, सैद्धांतिक रूप से पूरी तरह से अवरोधन और फिर से तारीख करने के लिए आउटपुट को इंटरफ़ेस में बदलने की अनुमति देता है, लेकिन अगर फ़ंक्शन पहले से ही सीमा से बाहर है (तो falseटाइमस्टैम्प इनपुट)

निष्कर्ष

डेटा के व्यावहारिक उद्देश्यों और पोर्टेबिलिटी के लिए वर्डप्रेस पोस्ट डेट रेंज 32 बिट यूनिक्स टाइमस्टैम्प के बराबर लगती है और इसमें वर्ष 1902 से 2037 तक समावेशी होते हैं

इस श्रेणी के वातावरण के किसी भी पोस्ट डेट ऑपरेशन के लिए ऑडिट किया जाना चाहिए (यूनिक्स टाइमस्टैम्प की 64 बिट रेंज, डी-फैक्टो फंक्शनिंग MySQL या वैल्यूज़ के लिए वैकल्पिक डेटाबेस स्टोरेज)। दूर की श्रेणियों के लिए ( 1000 से नीचे, 9999 से ऊपर ) कस्टम कोड की काफी मात्रा की आवश्यकता होने की संभावना है।

मनमाने तारीखों के किसी भी कार्यान्वयन के लिए यह समझ में आता है:

  • डेटाबेस सीमाओं के अधीन नहीं प्रारूप में उन्हें MySQL में स्टोर करें
  • पूरी तरह से कस्टम- Date/Timeकोडेड कोड और / या वर्डप्रेस फ़ंक्शन का उपयोग करके PHP में प्रक्रिया का ऑडिट किया गया है जो यूनिक्स टाइमस्टैम्प सीमा से प्रभावित नहीं है

कोड परीक्षण बिस्तर

उपरोक्त अनुसंधान के लिए निम्नलिखित कोड और वर्षों के हाथ के सेट का उपयोग किया गया है:

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
@kaiser php-ref , पसंद के डंप फंक्शन से बदलें :)
Rarst
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.