Tarafından sivri dışarı olarak birgire içinde onun cevabını , WordPress sonrası kimliği içermez güncelleme Metabokslar statü ve AJAX isteği geçirilen verilere AJAX kullanır ve bu da başına sonrası bazda güncelleme kutuları statüsüne zor hale getirir.
WordPress tarafından kullanılan AJAX eylemini bulduğumda, 'closed-postboxes'WordPress'in AJAX isteğini nasıl yaptığını bulmak için admin js klasöründe bu dizeyi aradım.
postbox.js118 numaralı satırda olduğunu gördüm .
Öyle görünüyor:
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
});
}
Esasen, WordPress, 'postbox' sınıfı ve 'kapalı' sınıfı olan DOM öğelerine bakar ve kimliklerinin virgülle ayrılmış bir listesini oluşturur. Aynı şey 'postbox' sınıfına sahip gizli DOM öğeleri için de yapılır.
Benim düşüncem şuydu: Doğru sınıflara sahip olan ve gizli olan, kimliğini posta kimliğini içerecek şekilde ayarlayan sahte bir meta kutu oluşturabilirim ve bu şekilde AJAX isteğinde alabilirim.
Ben de bunu yaptım:
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 );
}
});
Bu şekilde, her zaman kapalı ve her zaman gizli olan bir meta kutu oluşturdum, bu yüzden WordPress kimliğini $_POSTAJAX isteğinde var olarak gönderecek ve sahte kutu kimliği tahmin edilebilir bir şekilde post ID içerdiğinde , gönderiyi tanıyabiliyorum.
Bundan sonra WordPress'in AJAX görevini nasıl gerçekleştirdiğine baktım.
Gelen admin-ajax.phphattı 72 at , WordPress kanca 'wp_ajax_closed-postboxes'önceliği 1 olan.
Yani, WordPress'ten önce hareket etmek için, aynı eylemi öncelik 0 ile bağlayabilirim.
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 );
Verilerin bir meta metaya kaydedilmesi, WordPress yükleme seçeneklerini post meta'den zorlamak için filtrelemeyi get_user_option_closedpostboxes_mycptve get_user_option_metaboxhidden_mycpt( filtrenin her iki varyasyonunu get_user_option_{$option}) mümkün kıldı :
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 );
ve
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'nin özel verileri tanımasını sağlamak için kullanılacak fikir . Sadece çok fazla sevmiyorum düşünüyorum gerçekten güvenilir değil varwp_get_referergerçekten kullanımıdır ama bence "ana sorun" üstesinden gelmek için bir fikrim var;)$_SERVER