প্রতি পোস্টের ভিত্তিতে কীভাবে উন্মুক্ত / বন্ধ এবং লুকানো / দেখানো মেটাবক্সের স্থিতি সংরক্ষণ করবেন?


9

আমার আসল সমস্যাটি কিছুটা জটিল, তাই আমি এটিকে বিমূর্ত করার এবং এটি সহজ রাখার জন্য এখানে চেষ্টা করব।

আমি ওয়ার্ডপ্রেস ভিত্তিক একটি কাস্টম অ্যাপ্লিকেশন কাজ করছি। আমি একটি কাস্টম পোস্ট টাইপ নিবন্ধভুক্ত করেছি, আসুন এটি "লোক" হিসাবে কল করুন যেখানে আমি ... লোকদের সম্পর্কে তথ্য সঞ্চয় করি।

সিপিটি কেবল পোস্ট শিরোনাম এবং পোস্ট সামগ্রীর ডিফল্ট ক্ষেত্রগুলিকে সমর্থন করে তবে ব্যক্তির তথ্য সংরক্ষণের জন্য কিছু মেটাবক্স রয়েছে (আমার অ্যাপটিকে ঠিকানা বই হিসাবে ভাবেন)।

সুতরাং ব্যক্তিগত তথ্য সংরক্ষণ করার জন্য একটি মেটাবক্স রয়েছে, একটিতে সামাজিক নেটওয়ার্কের তথ্য সংরক্ষণ করার জন্য, অন্যটি কাজের সাথে সম্পর্কিত তথ্য সংরক্ষণ করার জন্য, অর্থাত্ যদি সে ব্যক্তি আমার কাছে কোনও গ্রাহক, সরবরাহকারী, যদি আমাদের ক্রেডিট বা ডেবিট থাকে ...

আমি এখানে সরলীকৃত করেছি, তবে সেখানে নিয়মিত পরিমাণে বিপাক রয়েছে, 12 বলে নেওয়া যাক।

আমার সমস্যাটি হ'ল, কিছু লোক যাদের জন্য আমি তথ্য সংরক্ষণ করতে চাই তারা কেবল র্যান্ডম যোগাযোগ, এবং আমি কেবল ব্যক্তিগত তথ্য সংরক্ষণ করতে চাই, অন্যরা বন্ধু এবং আমি ব্যক্তিগত তথ্য এবং সামাজিক নেটওয়ার্কের তথ্য সঞ্চয় করতে চাই, অন্যরা গ্রাহক বা সরবরাহকারী এবং আমি কাজের সাথে সম্পর্কিত তথ্য সঞ্চয় করতে চাই।

যদি কোনও পোস্ট সম্পাদনা করার সময় আমি লুকিয়ে থাকি ( স্ক্রিন বিকল্প মেনু মাধ্যমে ) বা আমার প্রয়োজন নেই এমন কোনও মেটাবক্স বন্ধ করে দেই, যখন আমার অন্য পোস্টের প্রয়োজন হয় যেখানে আমি তাদের প্রয়োজন বা আবার খুলতে হয়। যে কারণ metaboxes অবস্থান / স্থিতি / অর্ডার ব্যবহারকারী মেটাডাটা যেমন ব্যবহারকারী অনুসারে ভিত্তিতে সংরক্ষিত হয়

আপনি যদি কিছু পোস্টে কল্পনা করেন আমার 2 টি বিপাক প্রয়োজন, কিছু 10 এবং কিছু 5 তে, আপনি বুঝতে পেরেছেন যে এটি বিরক্তিকর কারণ সেগুলি সমস্ত দেখানো / খোলা রাখা সম্পাদনা স্ক্রিনটিকে কম অ্যাক্সেসযোগ্য করে তোলে (স্ক্রোলবার অন্তহীন বলে মনে হয়), এবং কখনও কখনও আমি যে তথ্য সন্ধান করি তা হ'ল পৃষ্ঠার শেষে কোনও তথ্য ছাড়াই একগুচ্ছ বিপাকের পরে ...

প্রশ্ন:

নির্দিষ্ট পোস্টের জন্য প্রতি পোস্টের ভিত্তিতে মেটাবক্স অবস্থান / অবস্থান / অর্ডার সংরক্ষণ করা সম্ভব?


পিএস: আমি জানি কিছু জেএস / জেকিউয়ারি সমস্যা সমাধান করতে পারে তবে সম্ভব হলে আমি জাভাস্ক্রিপ্ট সমাধানগুলি এড়াতে পারি।

উত্তর:


8

প্রধান সমস্যা:

এখানে মূল সমস্যাটি হ'ল ক্লোজিং- এ , লুকানো- এবং অর্ডার করা- এজ্যাক্স কলগুলিতে , পে -লোড সহ কোনও পোস্ট আইডি নেই। এখানে দুটি ফর্ম ডেটা উদাহরণ রয়েছে:

1) action:closed-postboxes
closed:formatdiv,tagsdiv-post_tag,trackbacksdiv,authordiv
hidden:slugdiv
closedpostboxesnonce:8723ee108f
page:post

2) action:meta-box-order
_ajax_nonce:b6b48d2d16
page_columns:2
page:post
order[side]:submitdiv,formatdiv,categorydiv,tagsdiv-post_tag,postimagediv
order[normal]:postexcerpt,postcustom,trackbacksdiv,commentsdiv,authordiv
order[advanced]:

আমরা আর একটি কাস্টম এজ্যাক্স কল ব্যবহার করে এটি পেতে পারি।

আমরা অবশ্যই কেবল হুকটিতে প্রবেশ করতে পারি save_postএবং পোস্টটি প্রতিবার সেভ করার সময় ডেটা পরিবর্তন করতে পারি। তবে এটি সাধারণ ইউআই অভিজ্ঞতা নয়, সুতরাং এটি এখানে বিবেচনা করা হবে না

এখানে নীচে বর্ণিত পিএইচপি সহ আরও অ-মার্জিত সমাধান উপলব্ধ রয়েছে:

একটি নন জাভাস্ক্রিপ্ট সমাধান:

প্রশ্ন কোথায় আছে তথ্য সংরক্ষণ করতে? ব্যবহারকারী মেটা ডেটা হিসাবে , মেটা ডেটা পোস্ট করতে পারেন বা কাস্টম টেবিলের মধ্যে থাকতে পারে?

এখানে আমরা ব্যবহারকারী মেটা ডেটা যেমন সংরক্ষণ এবং নিতে ক্লোজিং এর পোস্টে একটি উদাহরণ হিসাবে মেটা বক্স।

যখন closedpostboxes_postমেটা মান আপডেট হয়, আমরা এটিকে closedpostboxes_post_{post_id}মেটা মানেও সংরক্ষণ করি ।

তারপরে আমরা closedpostboxes_postব্যবহারকারীর আইডি এবং পোস্ট আইডির উপর ভিত্তি করে এটি সম্পর্কিত মেটা মান দিয়ে ওভাররাইড করার জন্য হাইজ্যাক করি ।

ক) closed-postboxesএজ্যাক্স অ্যাকশন চলাকালীন আপডেট করা :

আমরা পোস্ট আইডিটি আনতে পারি wp_get_referer()এবং তারপরে হ্যান্ডি url_to_postid()ফাংশনটি ব্যবহার করতে পারি । আমি @s_ha_dum থেকে উত্তরটি পড়ার পরে এই "মজাদার" ফাংশন সম্পর্কে প্রথম জানতে পেরেছিলাম , কয়েক মাস আগে ;-) দুর্ভাগ্যক্রমে ফাংশনটি ?post=123জিইটি ভেরিয়েবলগুলি স্বীকৃতি দেয় না , তবে আমরা এটির p=123কাছাকাছি যাওয়ার জন্য এটি পরিবর্তন করে কিছু কৌশল করতে পারি ।

আমরা মেটাতে পারি updated_user_meta, closedpostboxes_postএটির জন্য ব্যবহারকারীর মেটা ডেটা আপডেট হওয়ার ঠিক পরে :

add_action( 'updated_user_meta',                           
    function ( $meta_id, $object_id, $meta_key, $_meta_value )
    {
        $post_id = url_to_postid( str_replace( 'post=', 'p=', wp_get_referer() ) );
        if( 'closedpostboxes_post' === $meta_key && $post_id > 0 )
            update_user_meta( 
                $object_id, 
                'closedpostboxes_post_' . $post_id, 
                $_meta_value 
            );
    }
, 10, 4 );

খ) তথ্য আনা:

ব্যবহারকারীর মেটা get_user_option_closedpostboxes_postথেকে প্রাপ্ত ডেটা পরিবর্তন করতে আমরা হুকটিতে প্রবেশ করতে পারি closedpostboxes_post:

add_filter( 'get_user_option_closedpostboxes_post',
    function ( $result, $option, $user )
    {
        $post_id = filter_input( INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT );
        $newresult = get_user_option( 'closedpostboxes_post_'. $post_id , $user->ID );
        return ( $newresult ) ? $newresult : $result;
    }
, 10, 3 );

আমরা সেই ক্ষেত্রেও ভাবতে চাই যেখানে কোনও পোস্ট ভিত্তিক নেই closedpostboxes_post_{post_id}। সুতরাং এটি থেকে সর্বশেষ সংরক্ষিত সেটিংস ব্যবহার করবে closedpostboxes_post। সম্ভবত আপনি ডিফল্ট ক্ষেত্রে এটি সমস্ত খোলা বা সমস্ত বন্ধ রাখতে চান। এই আচরণটি পরিবর্তন করা সহজ হবে be

অন্যান্য কাস্টম পোস্ট ধরণের জন্য আমরা সংশ্লিষ্ট closedpostboxes_{post_type}হুক ব্যবহার করতে পারি ।

অর্ডার এবং ব্যবহারকারীর মেটাতে মেটাবক্সের অর্ডার এবং লুকানোর জন্য একই হওয়া উচিত ।metaboxhidden_{post_type}meta-box-order_{post_data}

PS: এই দীর্ঘ দীর্ঘ সাপ্তাহিক উত্তরের জন্য দুঃখিত, যেহেতু তাদের সর্বদা সংক্ষিপ্ত & জলি হওয়া উচিত ;-)


দুর্দান্ত +1। দীর্ঘ উত্তরের জন্য এন / পি, আমি সংক্ষিপ্তগুলি আশা করব না। সত্যি কথা বলতে, আমি উইকএন্ডে কোনও প্রত্যাশা করিনি :) দুটি জিনিস আমি খুব পছন্দ করেছি: 1 ম প্রতিটি ব্যবহারকারী এবং প্রতি-পোস্টের ভিত্তিতে ডেটা সংরক্ষণ করার ধারণা : আমার ধারণাটি পোস্ট মেটাতে সঞ্চয় করা ছিল, তবে সেভাবে সমস্ত ছিল ব্যবহারকারীদের একই অবস্থা থাকবে। 2 'get_user_option_*_post'ডাব্লুপি কাস্টম ডেটা সনাক্ত করতে ব্যবহার করার মত ধারণা । শুধু মনে হয় আমি খুব বেশী পছন্দ করেন না ব্যবহার হয় wp_get_refererসত্যিই উপর $_SERVERযে Var সত্যিই নির্ভরযোগ্য নয় ); কিন্তু আমি মনে করি একটি ধারণা "প্রধান সমস্যা" অতিক্রম করতে হবে
gmazzap

ধন্যবাদ, আমি অনুমান করি যে এটি ব্যবহারকারীর সংখ্যা এবং পোস্টের উপর নির্ভর করে যেখানে ডেটা সংরক্ষণ করা ভাল। হতে পারে এই ডেটাটিতে কিছু টিটিএল থাকা উচিত এবং মাসে একবার মুছে ফেলা উচিত? হ্যাঁ আমি এই wp_get_referer()পদ্ধতি সম্পর্কে আপনার সাথে একমত , এই কারণেই আমি এটিকে একটি অ-মার্জিত পিএইচপি সমাধান হিসাবে অভিহিত করেছি ;-) আমি প্রথমে প্রতিটি ব্যবহারকারীর জন্য বর্তমান পোস্ট আইডি সংরক্ষণ করার কথা ভেবেছিলাম, তবে কোনও ব্যবহারকারী যদি দু'একটি বা তার বেশি সম্পাদনা করে তবে তা কাজ করে না ব্রাউজারে পোস্ট। "মূল সমস্যা" সম্পর্কে আপনার ধারণার বিষয়ে শোনার অপেক্ষায় সপ্তাহান্তে উপভোগ করুন ;-)
বার্গিরে

43 দিন পরে একটি উর্ধ্বতন আমাকে এর উত্তর দিতে স্মরণ রেখেছে। আপনার উত্তরের জন্য আবার ধন্যবাদ।
গাজাজ্যাপ

6

দ্বারা সরু আউট হিসাবে 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 );

প্রাসঙ্গিক তথ্য +1 সহ একটি লুকানো মেটাবক্স ব্যবহার করে কী দুর্দান্ত ধারণা
বার্জায়ার

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