দ্বারা সরু আউট হিসাবে birgire মধ্যে তার উত্তর , ওয়ার্ডপ্রেস আপডেটের metaboxes অবস্থা এবং AJAX অনুরোধ পাস ডেটা পোস্ট ID অন্তর্ভুক্ত নয় করার AJAX এর ব্যবহার, এবং যে প্রতিটি পোস্টের ভিত্তিতে আপডেট বক্স অবস্থা কঠিন করে তোলে।
একবার আমি পেয়েছিলাম অ্যাজেএক্স ক্রিয়াটি ওয়ার্ডপ্রেস দ্বারা ব্যবহৃত is 'closed-postboxes' , আমি এই স্ট্রিংটির জন্য অ্যাডমিন জেএস ফোল্ডারে অনুসন্ধান করেছিলাম যে ওয়ার্ডপ্রেস কীভাবে এজেএক্স অনুরোধ করে।
আমি দেখেছি এটি # 118 লাইনে ঘটেছিলpostbox.js ।
দেখে মনে হচ্ছে:
save_state : function(page) {
var closed = $('.postbox').filter('.closed').map(function() {
return this.id;
}).get().join(',');
var hidden = $('.postbox').filter(':hidden').map(function() {
return this.id;
}).get().join(',');
$.post(ajaxurl, {
action: 'closed-postboxes',
closed: closed,
hidden: hidden,
closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),
page: page
});
}
মূলত, ওয়ার্ডপ্রেস ক্লাস 'পোস্টবক্স' এবং ক্লাস 'ক্লোজড' সহ ডোম আইটেমগুলিতে দেখায় এবং তাদের আইডিগুলির একটি কমা দ্বারা পৃথক করা তালিকা তৈরি করে। ক্লাস 'পোস্টবাক্স' সহ লুকানো ডিওএম আইটেমগুলির জন্য একই কাজ করা হয়।
সুতরাং, আমার চিন্তা ছিল: আমি একটি জাল তৈরি করতে পারি মেটাবক্স পারি যার সঠিক ক্লাস রয়েছে এবং এটি লুকানো আছে, এটির আইডি পোস্ট আইডি রাখার জন্য সেট করে এবং এইভাবে আমি এজেএক্স অনুরোধে এটি পুনরুদ্ধার করতে পারি।
আমি এই কাজটি করেছি:
add_action( 'dbx_post_sidebar', function() {
global $post;
if ( $post->post_type === 'mycpt' ) {
$id = $post->ID;
$f = '<span id="fakebox_pid_%d" class="postbox closed" style="display:none;"></span>';
printf( $f, $id );
}
});
এইভাবে আমি একটি মেটাবক্স তৈরি করেছি যা সর্বদা বন্ধ থাকে এবং সর্বদা লুকানো থাকে, সুতরাং ওয়ার্ডপ্রেস এটিজ $_POSTঅনুরোধের পরিবর্তে তার আইডি প্রেরণ করবে এবং একবার নকল বাক্স আইডিতে একটি অনুমানযোগ্য উপায়ে পোস্ট আইডি থাকে, আমি পোস্টটি সনাক্ত করতে সক্ষম হয়েছি।
এরপরে আমি তাকিয়েছিলাম যে ওয়ার্ডপ্রেস কীভাবে এজেএক্স কার্য সম্পাদন করে।
ইন admin-ajax.phpলাইন 72 এ , ওয়ার্ডপ্রেস আঙ্গুলসমূহ 'wp_ajax_closed-postboxes'অগ্রাধিকার 1।
সুতরাং, ওয়ার্ডপ্রেসের আগে কাজ করার জন্য, আমি একই ক্রিয়াটিকে অগ্রাধিকার 0 দিয়ে হুক করতে পারি।
add_action( 'wp_ajax_closed-postboxes', function() {
// check if we are in right post type: WordPress passes it in 'page' post var
$page = filter_input( INPUT_POST, 'page', FILTER_SANITIZE_STRING );
if ( $page !== 'mycpt' ) return;
// get post data
$data = filter_input_array( INPUT_POST, array(
'closed' => array( 'filter' => FILTER_SANITIZE_STRING ),
'hidden' => array( 'filter' => FILTER_SANITIZE_STRING )
) );
// search among closed boxes for the "fake" one, and return if not found
$look_for_fake = array_filter( explode( ',', $data[ 'closed' ] ), function( $id ) {
return strpos( $id, 'fakebox_pid_' ) === 0;
} );
if ( empty( $look_for_fake ) ) return;
$post_id = str_replace( 'fakebox_pid_', '', $look_for_fake[0] );
$user_id = get_current_user_id();
// remove fake id from values
$closed = implode(',', array_diff( explode(',', $data['closed'] ), $look_for_fake ) );
$hidden = implode(',', array_diff( explode(',', $data['hidden'] ), $look_for_fake ) );
// save metabox status on a per-post and per-user basis in a post meta
update_post_meta( $post_id, "_mycpt_closed_boxes_{user_id}", $closed );
update_post_meta( $post_id, "_mycpt_hidden_boxes_{user_id}", $hidden );
}, 0 );
কোনও পোস্ট মেটাতে ডেটা সংরক্ষণ করার ফলে পোস্ট মেটা থেকে ওয়ার্ডপ্রেস লোড বিকল্পগুলিকে জোর করে ফিল্টার করা get_user_option_closedpostboxes_mycptএবং get_user_option_metaboxhidden_mycpt( ফিল্টারের উভয় প্রকারের get_user_option_{$option}) পক্ষে সম্ভব হয়েছে :
add_filter( 'get_user_option_closedpostboxes_mycpt', function ( $result, $key, $user ) {
global $post;
$meta = get_post_meta( $post->ID, "_mycpt_closed_boxes_{$user->ID}", TRUE );
if ( ! empty( $meta ) ) {
$result = $meta;
}
return $result;
}, 10, 3 );
এবং
add_filter( 'get_user_option_metaboxhidden_mycpt', function ( $result, $key, $user ) {
global $post;
$meta = get_post_meta( $post->ID, "_mycpt_hidden_boxes_{$user->ID}", TRUE );
if ( ! empty( $meta ) ) {
$result = $meta;
}
return $result;
}, 10, 3 );
'get_user_option_*_post'ডাব্লুপি কাস্টম ডেটা সনাক্ত করতে ব্যবহার করার মত ধারণা । শুধু মনে হয় আমি খুব বেশী পছন্দ করেন না ব্যবহার হয়wp_get_refererসত্যিই উপর$_SERVERযে Var সত্যিই নির্ভরযোগ্য নয় ); কিন্তু আমি মনে করি একটি ধারণা "প্রধান সমস্যা" অতিক্রম করতে হবে