কারেন্ট_ইউজার_কেন () এবং সম্পর্কিত ফাংশনগুলি ব্যবহারের বৈধ সময় কী?


10

ভ্যানিলা WP কোর লোড চলাকালীন বর্তমান ব্যবহারকারী সেট আপ করা হচ্ছে $wp-init()যা থিম লোডের পরে এবং initহুকের আগে । এটি কার্যকারিতার ভাল অনুশীলনের সাথে সামঞ্জস্যপূর্ণ initবা তার সাথে পরে।

তবে এটি সাধারণ চর্চা যেমন সংশ্লিষ্ট ফাংশন, কল হয় current_user_can() তার আগে যে এর চেয়ে। এটি এমন প্লাগইনগুলির জন্য প্রয়োজনীয় সংজ্ঞা দ্বারা প্রয়োজনীয় যা লোড প্রক্রিয়াটির পূর্ববর্তী পর্যায়ে কাজ করে (আমার সরঞ্জামদণ্ডের থিম স্যুইচার প্লাগইনের একটি উদাহরণ হতে পারে)।

ডকুমেন্টেশন এই অনুশীলনের পক্ষে বা বিপক্ষে কোনও দাবি করে না (যা আমি খুঁজে পেতে পারি)।

তবে কিছু প্লাগইন ব্যবহারকারীর সাথে সম্পর্কিত কার্যকারিতা সম্পর্কে মনে হয় এবং সর্বদা পোস্টের initঅবস্থা আশা করে ।

উদাহরণস্বরূপ bbPress নিম্নলিখিত নোটিশ নিক্ষেপ:

// If the current user is being setup before the "init" action has fired,
// strange (and difficult to debug) role/capability issues will occur.
if ( ! did_action( 'after_setup_theme' ) ) {
    _doing_it_wrong( __FUNCTION__, __( 'The current user is being initialized without using $wp->init().', 'bbpress' ), '2.3' );
}

দ্রুত বিক্ষোভের জন্য এটির মূল সংজ্ঞাটিতে ফেলে দিন current_user_can():

function current_user_can( $capability ) {

    if ( ! did_action('after_setup_theme') ) {
        echo wp_debug_backtrace_summary();
    }

এই পরিস্থিতিতে "সঠিক" কে? ব্যবহারকারী-সম্পর্কিত কার্যাবলী ব্যবহারের নিষিদ্ধ / নিষিদ্ধ ব্যবহার সম্পর্কে কি কোনও আধ্যাত্মিক দৃ determination়তা আছে init?


উত্তর:


7

শুধু পূর্বশর্ত current_user_can()একটি বিদ্যমান নয় wp_get_current_user()। পরেরটি সংজ্ঞায়িত করা হয়েছে pluggable.php, সুতরাং আপনি এটি পরে ব্যবহার করতে পারেন plugins_loaded

_doing_it_wrong()আপনি আপনার প্রশ্নে যে কলটি উদ্ধৃত করছেন তা নিজের পক্ষে ভুল। আমার অনুমান যে আপনি এটি বুডিপ্রেস বা বিবিপ্রেস থেকে নিয়েছেন। তারা যদি এতক্ষণ অপেক্ষা না করে তবে উভয়ই পুনরাবৃত্তি হতে চলেছে। পুনরাবৃত্তি রোধ করার আরও ভাল উপায় রয়েছে।

কিছু কিছু ক্ষেত্রে, মত লোকেল পরিবর্তন করা , আপনি আছে অ্যাক্সেস করতে বর্তমান ব্যবহারকারীর বস্তুর আগে, তাই জন্য অপেক্ষা after_setup_themeএমনকি একটি বিকল্প নয়।



2

আপনি যদি ব্যবহারকারীর সক্ষমতার আগে যদি পরীক্ষা করেন initতবে এর সম্ভাবনা থাকার সম্ভাবনা রয়েছে আপনি বর্তমান ব্যবহারকারীর অবজেক্টের সেটিংয়ের জন্য দায়ী।

আপনি যদি এর পরে ব্যবহারকারীর অ্যাক্সেস করেন initতবে আপনি নিশ্চিত যে ইতিমধ্যে ব্যবহারকারীকে অন্য কোনও কিছু সেটআপ করেছেন, বেশিরভাগ সময় নিজেই মূল হন।

এজন্য ব্যবহারকারীর পরে অ্যাক্সেস করা নিরাপদinit হিসাবে বিবেচিত হয় ।

বস্তুত, আগাম অ্যাক্সেস সম্ভবত ভঙ্গ করতে পারে কিছু ফিল্টার চলমান determine_current_user

এটি একটি "ভঙ্গুর" হুক বলা উচিত, কারণ এটি কখনও চালিত না হওয়ার সম্ভাবনা রয়েছে, কেবল প্লাগেবল ফাংশনেই তাকে বরখাস্ত করা হয়।

তবে, এমন কেস রয়েছে (যেমন @ টসচো বলেছিলেন) যেখানে আপনি আর ডি না করা অবধি অপেক্ষা করতে পারবেন না , সে ক্ষেত্রে আপনার কোনও বিকল্প নেই।

যে কোনও অসঙ্গতি সমাধানের একমাত্র উপায় হ'ল কেস যদি হ'ল তবে।

একটি সমাধান যে পারে (bbPress / BuddyPress সহ) বেশিরভাগ ক্ষেত্রেই কাজ পরিবর্তে ফাংশন নিম্নলিখিত ব্যবহার করা current_user_can:

function compat_current_user_can( $capability )
{
  if ( did_action( 'init' ) ) {
     return current_user_can( $capability );
  }

  $user_id = apply_filters( 'determine_current_user', false );

  return user_can( $user_id, $capability );
}

এটি বৈশ্বিক ব্যবহারকারীকে সেট না করেই চলতি ব্যবহারকারীর দক্ষতা তাড়াতাড়ি যাচাই করতে দেয়, তাই তত্ত্বীয়ভাবে আগে চালানো নিরাপদ init

সমস্যাটি হ'ল উপরে বর্ণিত হিসাবে, যে কোনও কোড যা প্লাগযোগ্য ফাংশনগুলিকে ওভাররাইড করে এবং অগ্নিনির্ভর হয় determine_current_userit


আমি মনে করি আপনার ফাংশনটিতে ভেরিয়েবলগুলি রয়েছে বিশৃঙ্খলা। :)
রাস্ট

হ্যাঁ ... রাতের খাবারের আগে খুব দ্রুত টাইপ করা হয়েছে: ফিক্সিংয়ের জন্য @ ধন্যবাদিয়ায়লোকিন
গাজাজ্যাপ

এটি উল্লেখ করবেন না। শুধু ভুলটি কি তা বলবেন না, এটি @ রারস্ট :) ঠিক করুন
নিকোলাই

1

আমি ভাবতে আগ্রহী যে _doing_it_wrongবার্তা জারির আগে বাডিপ্রেস এবং বিবিপ্রেসকে অন্য কিছু পরীক্ষা করা উচিত

আমি উভয় রুটিন পরিবর্তন করে $ কারেন্ট_ইউজারটির আসল সেটিংটিও যাচাই করেছিলাম।

global $current_user; 
if ( is_null( $current_user ) ) {
    _doing_it_wrong( ... );
}

বিজ্ঞপ্তিগুলি আর প্রদর্শিত হয়নি।

এর জন্য পরীক্ষাটি did_action( "after_setup_theme" )বেল্টের সাথে যাওয়ার জন্য ধনুর্বন্ধনী হয়।

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