ওয়ার্ডপ্রেসের প্রতিটি পোস্ট আপডেট 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_data
2 কারণে:
- এটি আপডেটের আগে চলে , তাই আপনাকে পুনরুদ্ধার করতে হবে না তবে আপনি প্রতিরোধ করতে পারেন
- এটি ২ টি প্যারামিটারগুলি পাস করে: ফাংশন আপডেট হতে চলেছে এমন ডেটা এবং পাস হওয়া প্যারামিটারগুলির একটি অ্যারে, (আপডেটের ক্ষেত্রে) পোস্টটির আইডি রাখে
সুতরাং একটি সাধারণ ব্যবহার করে 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
ফাংশনটি কল করুন , যেমন অ্যাজাক্সের মাধ্যমে।