হাই @ ইউজার ২০৪১:
স্পষ্টতই আপনি জানেন যে অনুসন্ধানের জন্য আপনার প্রয়োজনীয় WP_User_Search
শ্রেণীর উদাহরণগুলিতে মানগুলি সংশোধন করে যা করতে পারেন তা সম্পাদনা করতে হবে (উত্স কোডটি /wp-admin/includes/user.php
যদি আপনি এটি অধ্যয়ন করতে চান তবে আপনি এটি সন্ধান করতে পারেন))
WP_User_Search
অবজেক্ট
এখানে কি একটা print_r()
ওয়ার্ডপ্রেস 3.0.3 যখন মেয়াদ অনুসন্ধানের জন্য মতো যে বস্তুর রূপ " TEST
" এবং অন্য কোন প্লাগিন এটি প্রভাবিত করতে পারে ছাড়া:
WP_User_Search Object
(
[results] =>
[search_term] => TEST
[page] => 1
[role] =>
[raw_page] =>
[users_per_page] => 50
[first_user] => 0
[last_user] =>
[query_limit] => LIMIT 0, 50
[query_orderby] => ORDER BY user_login
[query_from] => FROM wp_users
[query_where] => WHERE 1=1 AND (user_login LIKE '%TEST%' OR user_nicename LIKE '%TEST%' OR user_email LIKE '%TEST%' OR user_url LIKE '%TEST%' OR display_name LIKE '%TEST%')
[total_users_for_query] => 0
[too_many_total_users] =>
[search_errors] =>
[paging_text] =>
)
দ্য pre_user_search
হুক
WP_User_Search
অবজেক্টের মানগুলি সংশোধন করতে আপনি 'pre_user_search'
হুক ব্যবহার করবেন যা বস্তুর বর্তমান উদাহরণটি পেয়েছে; আমি print_r()
উপরে বর্ণিত এর মানগুলিতে অ্যাক্সেস পেতে সেই হুকের মধ্যে থেকে ফোন করেছি।
নিম্নলিখিত উদাহরণটি যা আপনি আপনার থিমের অনুলিপি করতে পারেন functions.php
ফাইলটিতে বা আপনি যে প্লাগইনটি লিখছেন তার জন্য পিএইচপি ফাইল ব্যবহার করতে পারেন যা অন্যান্য ক্ষেত্রগুলিতে অনুসন্ধান করতে সক্ষম হওয়া ছাড়াও ব্যবহারকারীর বিবরণে অনুসন্ধান করার ক্ষমতা যুক্ত করে । ফাংশনটি আপনাকে এবং এসকিউএল বোঝার জন্য স্বাচ্ছন্দ্য বোধ করা উচিত এমন বস্তুর বৈশিষ্ট্য query_from
এবং query_where
বৈশিষ্ট্যগুলি সংশোধন করে $user_search
।
হুক্সে সাবধানী সংশোধনকারী এসকিউএল
কোডটি yoursite_pre_user_search()
ফাংশনের ধরে নিয়েছে যে এর query_where
আগে অন্য কোনও প্লাগইন ধারাটি সংশোধন করে নি; যদি অন্য প্লাগইন যেখানে দফা সংশোধন করা হয়েছে যেমন যে প্রতিস্থাপন 'WHERE 1=1 AND ('
সঙ্গে "WHERE 1=1 AND ({$description_where} OR"
আর কাজ তারপর খুব ভঙ্গ করবে। এটির মতো এসকিউএল সংশোধন করার সময় একটি শক্তিশালী সংযোজন যা অন্য কোনও প্লাগইন দ্বারা ভেঙে ফেলা যায় না, এটি লিখতে আরও শক্ত।
হুকসে এসকিউএল সন্নিবেশ করানোর সময় নেতৃস্থানীয় এবং ট্রেলিং স্পেস যুক্ত করুন
এছাড়াও নোট করুন যে ওয়ার্ডপ্রেসে এসকিউএল ব্যবহার করার সময় এটির সাথে শীর্ষস্থানীয় এবং পিছনের স্থানগুলি অন্তর্ভুক্ত করা সর্বদা একটি ভাল ধারণা " INNER JOIN {$wpdb->usermeta} ON "
অন্যথায় আপনার SQL কোয়েরি সামনে কোন স্থান নেই যেখানে থাকতে পারে নিম্নলিখিত "INNER"
, হবে যা অবশ্যই ব্যর্থ: " FROM wp_postsINNER JOIN {$wpdb->usermeta} ON "
।
"{$wpdb->table_name"}
হার্ডকোডিং সারণীর নামগুলির পরিবর্তে ব্যবহার করুন
এরপরে $wpdb
সাইটটি সারণী উপসর্গটি 'wp_'
অন্য কোনও কিছুতে পরিবর্তিত করে সেক্ষেত্রে সর্বদা বৈশিষ্ট্যগুলি টেবিলের নাম উল্লেখ করতে ব্যবহার করার বিষয়ে নিশ্চিত হন । সুতরাং এটি উল্লেখ করা ভাল "{$wpdb->users}.ID"
(একক নয়, ডাবল উদ্ধৃতি সহ) হার্ডকোডিংয়ের পরিবর্তে উল্লেখ করা ভাল "wp_users.ID"
।
অনুসন্ধানের শর্তাবলী বিদ্যমান থাকলেই ক্যোয়ারিকে সীমাবদ্ধ করুন
শেষ অবধি কেবলমাত্র অনুসন্ধানের সংশোধন করার জন্য যখন কোনও অনুসন্ধান শব্দ থাকে যা আপনি এর search_term
সম্পত্তি পরিদর্শন করে পরীক্ষা করতে পারেনWP_User_Search
বস্তুর ।
yoursite_pre_user_search()
জন্য ফাংশন'pre_user_search'
add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
global $wpdb;
if (!is_null($user_search->search_term)) {
$user_search->query_from .= " INNER JOIN {$wpdb->usermeta} ON " .
"{$wpdb->users}.ID={$wpdb->usermeta}.user_id AND " .
"{$wpdb->usermeta}.meta_key='description' ";
$description_where = $wpdb->prepare("{$wpdb->usermeta}.meta_value LIKE '%s'",
"%{$user_search->search_term}%");
$user_search->query_where = str_replace('WHERE 1=1 AND (',
"WHERE 1=1 AND ({$description_where} OR ",$user_search->query_where);
}
}
প্রতিটি মেটা কী-মান জোড় অনুসন্ধান করার জন্য একটি এসকিউএল প্রয়োজন JOIN
অবশ্যই ওয়ার্ডপ্রেস আপনাকে ইউজারমেটা ক্ষেত্রগুলিতে অনুসন্ধান করতে দেয় না এটি হ'ল প্রত্যেকটি JOIN
ক্যোয়ারিতে একটি এসকিউএল যুক্ত করে এবং খুব বেশি যোগদানের সাথে একটি কোয়েরিতে সত্যই ধীর হতে পারে। যদি আপনাকে সত্যিই অনেকগুলি ক্ষেত্র অনুসন্ধান করতে হয় তবে আমি '_search_cache'
ইউজারমেটাতে এমন একটি ক্ষেত্র তৈরি করব যা অন্য সমস্ত তথ্য এক ইউজারমেটা ক্ষেত্রের মধ্যে সংগ্রহ করে এটি সমস্ত অনুসন্ধানের জন্য কেবল একটি যোগ প্রয়োজন।
মেটা কীগুলিতে শীর্ষস্থানীয় অ্যান্ডস্কোরগুলি ওয়ার্ডপ্রেসকে প্রদর্শন করতে নয় বলে
নোট করুন যে শীর্ষস্থানীয় আন্ডারস্কোরটি '_search_cache'
ওয়ার্ডপ্রেসকে বলে যে এটি একটি অভ্যন্তরীণ মান এবং এটি ব্যবহারকারীর কাছে প্রদর্শন করার মতো কিছু নয়।
হুকস 'profile_update'
এবং 'user_register'
হুক্স সহ একটি অনুসন্ধান ক্যাশে তৈরি করুন
সুতরাং আপনাকে উভয়কেই হুক করতে হবে 'profile_update'
এবং 'user_register'
এটি যথাক্রমে কোনও ব্যবহারকারীকে সংরক্ষণ এবং একটি নতুন ব্যবহারকারীর নিবন্ধকরণে চালিত হবে। আপনি সেই সমস্ত হুকগুলিতে সমস্ত মেটা কী এবং তাদের মানগুলি ধরতে পারেন (তবে মানগুলি যা সিরিয়ালযুক্ত বা URL এনকোডেড অ্যারে রয়েছে সেগুলি বাদ দিন) এবং তারপরে এগুলি ব্যবহার করে একটি দীর্ঘ মেটা মান হিসাবে সংরক্ষণ করতে সংযুক্ত করতে পারেন'_search_cache'
কীটি ।
'|'
সীমিত কী-মান জুড়ি হিসাবে মেটাকে সঞ্চয় করুন
আমি সমস্ত মূল নাম এবং তার সমস্ত মান গ্রহন করার সিদ্ধান্ত নিয়েছি এবং মানগুলি এবং উল্লম্ব বারগুলি ("|") থেকে কীগুলি পৃথক করে ("|") এর মতো কী-মান জোড়কে আলাদা করে (I এগুলি একাধিক লাইন জুড়ে জড়িয়ে রেখেছে যাতে আপনি ডানদিকে স্ক্রল ছাড়াই এগুলি করতে পারেন):
nickname:mikeschinkel|first_name:mikeschinkel|description:This is my bio|
rich_editing:true|comment_shortcuts:false|admin_color:fresh|use_ssl:null|
wp_user_level:10|last_activity:2010-07-28 01:25:46|screen_layout_dashboard:2|
plugins_last_view:recent|screen_layout_post:2|screen_layout_page:2|
business_name:NewClarity LLC|business_description:WordPress Plugin Consulting|
phone:null|last_name:null|aim:null|yim:null|jabber:null|
people_lists_linkedin_url:null
মেটা ব্যবহারে বিশেষত অনুসন্ধানগুলি সক্ষম করে key:value
কী এবং মানগুলি যেমনটি যোগ করছিল তেমনি আপনাকে rich_editing:true
সমৃদ্ধ সম্পাদনা করা প্রত্যেককে খুঁজে পেতে " " এর মতো অনুসন্ধান করতে বা "অনুসন্ধান করতে" অনুমতি দেয়phone:null
"ফোন নম্বরবিহীন ব্যক্তিদের ।
তবে অনুসন্ধান শিল্প থেকে সাবধান থাকুন
অবশ্যই এই কৌশলটি ব্যবহার করা সম্ভবত "ব্যবসায়" এর সন্ধানের মতো অযাচিত অনুসন্ধানের নিদর্শনগুলি তৈরি করে এবং প্রত্যেককে তালিকাভুক্ত করা হবে। যদি এটি কোনও সমস্যা হয় তবে আপনি সম্ভবত এই জাতীয় বিস্তৃত ক্যাশে ব্যবহার করতে চাইবেন না।
yoursite_profile_update()
জন্য ফাংশন 'profile_update'
এবং'user_register'
ফাংশনের জন্য উপরের yoursite_profile_update()
মতো yoursite_pre_user_search()
আপনার থিমের functions.php
ফাইলে অনুলিপি করা যায় বা আপনি যে প্লাগইনটি লিখছেন তার জন্য আপনি পিএইচপি ফাইল ব্যবহার করতে পারেন:
add_action('profile_update','yoursite_profile_update');
add_action('user_register','yoursite_profile_update');
function yoursite_profile_update($user_id) {
$metavalues = get_user_metavalues(array($user_id));
$skip_keys = array(
'wp_user-settings-time',
'nav_menu_recently_edited',
'wp_dashboard_quick_press_last_post_id',
);
foreach($metavalues[$user_id] as $index => $meta) {
if (preg_match('#^a:[0-9]+:{.*}$#ms',$meta->meta_value))
unset($metavalues[$index]); // Remove any serialized arrays
else if (preg_match_all('#[^=]+=[^&]\&#',"{$meta->meta_value}&",$m)>0)
unset($metavalues[$index]); // Remove any URL encoded arrays
else if (in_array($meta->meta_key,$skip_keys))
unset($metavalues[$index]); // Skip and uninteresting keys
else if (empty($meta->meta_value)) // Allow searching for empty
$metavalues[$index] = "{$meta->meta_key }:null";
else if ($meta->meta_key!='_search_cache') // Allow searching for everything else
$metavalues[$index] = "{$meta->meta_key }:{$meta->meta_value}";
}
$search_cache = implode('|',$metavalues);
update_user_meta($user_id,'_search_cache',$search_cache);
}
সমস্ত আকর্ষণীয় মেটা মানগুলি অনুসন্ধানের জন্য yoursite_pre_user_search()
একটি একক এসকিউএল সক্ষম করার JOIN
জন্য আপডেট ফাংশন
অবশ্যই yoursite_profile_update()
কোনও প্রভাব ফেলতে আপনাকে বর্ণনার পরিবর্তে মেটা কীটি yoursite_pre_user_search()
ব্যবহার করতে '_search_cache'
হবে যা আমাদের এখানে রয়েছে (উপরে বর্ণিত একই ক্যাভেট সহ):
add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
global $wpdb;
if (!is_null($user_search->search_term)) {
$user_search->query_from .= " INNER JOIN {$wpdb->usermeta} ON " .
"{$wpdb->users}.ID={$wpdb->usermeta}.user_id AND " .
"{$wpdb->usermeta}.meta_key='_search_cache' ";
$meta_where = $wpdb->prepare("{$wpdb->usermeta}.meta_value LIKE '%s'",
"%{$user_search->search_term}%");
$user_search->query_where = str_replace('WHERE 1=1 AND (',
"WHERE 1=1 AND ({$meta_where} OR ",$user_search->query_where);
}
}