ওয়ার্ডপ্রেস দ্বারা ডেটাবেসে 'পোস্ট_ কনটেন্ট_ফিল্ডার' কলামটি কখন সাফ করা হয়?


29

কিছু ওয়ার্ডপ্রেস প্লাগইন (যদিও খুব কম) post_content_filteredএকটি পোস্টের সাথে সম্পর্কিত কিছু ডেটা সংরক্ষণ করতে ডাটাবেসে কলামটি ব্যবহার করে ।

উদাহরণস্বরূপ, সংরক্ষণের উপর মার্কডাউন post_content_formattedকলামের আলাদাভাবে কোনও পোস্টের মার্কডাউন সংস্করণ এবং কলামে পার্সড এইচটিএমএল সংরক্ষণ করে post_content, যাতে প্লাগইন নিষ্ক্রিয় করা হলে পোস্টগুলি মার্কডাউন স্পাউড না করে (কারণ এইচটিএমএল সঞ্চিত থাকে post_content)।

এখন, আমি বুঝতে পেরেছি যে post_content_filteredঅস্থায়ী সঞ্চয়স্থানের জন্য বেশ ব্যবহার করা হয়েছে অর্থাৎ কলামের সামগ্রীটি হারিয়ে গেছে (বা সাফ করা হয়েছে):

  • আপনি 'কুইক এডিট' বিকল্পটি ব্যবহার করে কোনও পোস্টে (শিরোনাম, ট্যাগ, বিভাগগুলি) পরিবর্তন করতে পারেন

  • একটি নির্ধারিত পোস্ট (স্বয়ংক্রিয়ভাবে) প্রকাশিত হয়

  • আপনি পোস্টে বাল্ক সম্পাদনা করেন

  • আপনি একটি পোস্ট সংশোধন মধ্যে পরিবর্তন করতে পারেন

  • কোনও পোস্ট বহিরাগত সম্পাদক থেকে সংরক্ষিত হয় (যেমন ওয়ার্ডপ্রেস পোস্ট সম্পাদক নয়)

প্রশ্নাবলী:

  1. অন্যান্য কোন পরিস্থিতিতে post_content_filteredকলামের ডেটা সাফ করা হয়?

  2. এটি আদৌ ঘটে যাওয়া রোধ করার কোনও উপায় আছে কি? (আমি বোঝাতে চাইছি, কীভাবে তথ্য স্থায়ীভাবে সংরক্ষণ করা আছে, post_contentকলামটি যেভাবে আচরণ করা হবে তা নিশ্চিত করার কোনও উপায় আছে ?)

উত্তর:


29

ওয়ার্ডপ্রেসের প্রতিটি পোস্ট আপডেট wp_update_postফাংশন দ্বারা পরিচালিত হয় ।

এই ফাংশনটির কিছু ডিফল্ট রয়েছে এবং post_content_filteredডিফল্ট মানটির জন্য '' (খালি স্ট্রিং) থাকে।

ডিফল্টগুলি আরোগুলির সাথে ফাংশনে পাস করার সাথে মার্জ হয়ে যাওয়ার wp_parse_argsঅর্থ এই যে প্রতিবার কোনও পোস্ট আপডেট করা হয় এবং post_content_filteredস্পষ্টভাবে পাস না করা হয় এটি খালি স্ট্রিংয়ে সেট করা থাকে।

এখন আমরা জিজ্ঞাসা করতে পারি: post_content_filteredস্পষ্টভাবে কখন পাস করা হয় wp_update_post? উত্তরটি: ওয়ার্ডপ্রেস দ্বারা কখনই নয়

সুতরাং আপনার প্রথম প্রশ্নের জন্য:

অন্য কোন পরিস্থিতিতে পোস্ট_কন্টেন্ট_ ফিল্টারকৃত কলামের ডেটা সাফ করা হয়?

সংক্ষিপ্ত উত্তর: প্রতিবার কোনও কারণে কোনও কারণে আপডেট করা হয়

নোট করুন যে কেবল একটি ক্ষেত্র পরিবর্তন করা একটি আপডেট, বিশেষত, প্রতিটি স্থিতি পরিবর্তন একটি আপডেট eg যেমন প্রকাশের জন্য খসড়া, প্রকাশের জন্য মুলতুবি, প্রকাশের ভবিষ্যত, ট্র্যাশে প্রকাশিত (একটি পোস্ট মুছে ফেলা), এবং এই জাতীয় ...

যদি কোনও পোস্টে কিছু পরিবর্তন হয়, তবে post_content_filteredতা সাফ হয়ে যায়; কেবল ব্যতিক্রম হ'ল যখন post_content_filteredস্পষ্টভাবে প্রেরণ করা হবে wp_update_post, এবং যেমন ইতিমধ্যে বলা হয়েছে, ওয়ার্ডপ্রেস দ্বারা এটি কখনও হয় না।

এটি আদৌ ঘটে যাওয়া রোধ করার কোনও উপায় আছে কি? (মানে, স্থায়ীভাবে ডেটা সংরক্ষণ করা হয়েছে তা নিশ্চিত করার কোনও উপায় আছে কি?

যদি আপনি এই কোডটি আপনার কোড দিয়ে তৈরি করেন এবং আপনি এটি সংরক্ষণ করতে চান তবে আপনাকে ওয়ার্ডপ্রেস দ্বারা সম্পাদিত প্রতিটি আপডেটের দিকে নজর দিতে হবে এবং পরিবর্তনটি রোধ করতে হবে।

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

আমি পরামর্শ দিচ্ছি যে হুকটি হ'ল wp_insert_post_data2 কারণে:

  • এটি আপডেটের আগে চলে , তাই আপনাকে পুনরুদ্ধার করতে হবে না তবে আপনি প্রতিরোধ করতে পারেন
  • এটি ২ টি প্যারামিটারগুলি পাস করে: ফাংশন আপডেট হতে চলেছে এমন ডেটা এবং পাস হওয়া প্যারামিটারগুলির একটি অ্যারে, (আপডেটের ক্ষেত্রে) পোস্টটির আইডি রাখে

সুতরাং একটি সাধারণ ব্যবহার করে get_postআপনি পোস্টটি এখন কীভাবে এবং পোস্টটি কেমন হবে তা তুলনা করতে সক্ষম: আপনার যদি কিছু পছন্দ না হয় তবে আপনি এটি পরিবর্তন করতে পারেন।

কোড দিন:

add_filter( 'wp_insert_post_data', 'preserve_content_filtered', 999, 2 );

function preserve_content_filtered ( $data, $postarr ) {

    /* If this is not an update, we have nothing to do */
    if ( ! isset($postarr['ID']) || ! $postarr['ID'] ) return $data;

    /*
     * Do you want you filter per post_type?
     * You should, to prevent issues on post type like menu items.
     */
    if ( ! in_array( $data['post_type'], array( 'post', 'page' ) ) ) return $data;

    /* How post is now, before the update */
    $before = get_post( $postarr['ID'] ); 

    /* If content_filtered is already empty we have nothing to preserve */
    if ( empty( $before->post_content_filtered ) ) return $data;

    if ( empty( $data['post_content_filtered'] ) ) {
        /*
         * Hey! WordPress wants to clear our valuable post_content_filtered...
         * Let's prevent it!
         */
        $data['post_content_filtered'] = $before->post_content_filtered;
    }

    return $data;

}

একটি সম্ভাব্য সমস্যা রয়েছে, যেখানে আগের ফাংশনটি প্রতিটি post_content_filtered পরিষ্কারকে বাধা দেয় । এবং আপনি যদি কোনও কারণে এটি পরিষ্কার করতে চান?

আমি বলেছি যে প্রতিটি ডাব্লুপি পোস্ট পরিবর্তন পরিচালনা করে wp_update_postতবে আপনি ওয়ার্ডপ্রেস নন।

আপনি যেমন একটি ফাংশন লিখতে পারেন:

function reset_post_content_filtered( $postid ) {
    global $wpdb;
    $wpdb->query( $wpdb->prepare(
        "UPDATE $wpdb->posts SET `post_content_filtered` = '' WHERE `ID` = %d", $postid
    ) );
}

একটি $wpdbক্যোয়ারী হওয়ায় এটি আমাদের ফিল্টারটিকে ট্রিগার করে না, তাই পুনরায় সেট করা কোনও সমস্যা ছাড়াই সম্পন্ন হয় এবং আপনার কোডের যে কোনও জায়গায় আপনাকে পুনরায় সেট করতে হবে post_content_filtered, আপনি এই ফাংশনটি কল করতে পারেন।

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

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