অ্যাডমিনে ব্যবহারকারীদের থেকে সমস্ত ব্যবহারকারী মেটা কীভাবে অনুসন্ধান করবেন to


14

অ্যাডমিন অঞ্চলে তালিকাভুক্ত ব্যবহারকারীদের শীর্ষে অনুসন্ধানের ফর্মটি (ডাব্লুপি-অ্যাডমিন / ইউজারস.পিএফ) সীমাবদ্ধ এবং ব্যবহারকারীর সমস্ত মেটা ক্ষেত্র যেমন বায়ো, তাত্ক্ষণিক ম্যাসেঞ্জার হ্যান্ডেল ইত্যাদির সন্ধান করে না I've এটি যুক্ত করতে পারে এমন একটি প্লাগইন খুঁজতে সক্ষম হয়েছি।

যে কোনও প্লাগইন বা আমি তৈরি করতে পারি এমন কোনও ফাংশন সম্পর্কে সচেতন সে _ _ ব্যবহারকারীর ডিবিতে সমস্ত তারিখের জন্য এই অনুসন্ধানটি প্রসারিত করতে পারে - একটি প্লাগইন বা ফাংশন দ্বারা নির্মিত আদর্শভাবে এমনকি অতিরিক্ত ক্ষেত্রগুলি।

উত্তর:


24

হাই @ ইউজার ২০৪১:

স্পষ্টতই আপনি জানেন যে অনুসন্ধানের জন্য আপনার প্রয়োজনীয় 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);
  }
}

@ মাইকস্কিঙ্কেল দুর্দান্ত, পুরো উত্তর! এটি এই সাইটে এমন বহুবারের মধ্যে একটি যেখানে আমি আশা করি যে আমি একটি স্টকহীন প্রশ্নের উত্তম গবেষণামূলক উত্তরটির জন্য একাধিক উন্নতি দিতে পারব।
ম্যাথসম্যাথ

ধন্যবাদ @ ম্যাথসম্যাট - লোকেরা এর প্রশংসা করে তা শেখা আমাকে চালিয়ে যায়। :)
মাইকচিন্কেল

মাইক, পুরো উত্তরের জন্য ধন্যবাদ! আমি আজকে এই পরে আমার থিমটিতে কাজ করব এবং দেখব কে যায়।
জন চ্যান্ডলার

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

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

5

আমি সত্যিই উপরে মাইকচিনকেলের পদ্ধতির এবং পুরো ব্যাখ্যাটির প্রশংসা করেছি। এটি অতি সহায়ক ছিল। Pre_user_search অবমূল্যায়ন করা হয়েছে এবং আসলে 3.2-এ কাজ করে না বলে আমার পক্ষে এটি কাজ করতে পারি না। আমি এটিকে প্রি-ইউজার_উইউরি দিয়ে কেবল স্যুইচ আউট করার চেষ্টা করেছি কিন্তু এটিও কার্যকর হয়নি। বিষয়টি হ'ল মনে হচ্ছে যে $ ব্যবহারকারীর_সন্ধান-> অনুসন্ধান_আপনার কাজ আর কাজ করে না তাই আমি স্রেফ used _GET ['s'] ব্যবহার করেছি। আমি কিছু হ্যাকিং দূরে করেছিলাম এবং এটি 3.2-এ কাজ করতে সক্ষম হয়েছি। আপনাকে কেবলমাত্র অনুসন্ধানযোগ্য মেটাডেটার অ্যারে সেট করতে হবে।

//Searching Meta Data in Admin
add_action('pre_user_query','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
    global $wpdb;
    if (!isset($_GET['s'])) return;

    //Enter Your Meta Fields To Query
    $search_array = array("customer_id", "postal_code", "churchorganization_name", "first_name", "last_name");

    $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID={$wpdb->usermeta}.user_id AND (";
    for($i=0;$i<count($search_array);$i++) {
        if ($i > 0) $user_search->query_from .= " OR ";
            $user_search->query_from .= "{$wpdb->usermeta}.meta_key='" . $search_array[$i] . "'";
        }
    $user_search->query_from .= ")";        
    $custom_where = $wpdb->prepare("{$wpdb->usermeta}.meta_value LIKE '%s'", "%" . $_GET['s'] . "%");
    $user_search->query_where = str_replace('WHERE 1=1 AND (', "WHERE 1=1 AND ({$custom_where} OR ",$user_search->query_where);    
}

আশা করি এটি কারও সাহায্য করবে।


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

1

এফওয়াইআই, এই বিষয়টিতে অনুসন্ধান করা লোকগুলির জন্য (কীভাবে ব্যবহারকারী প্যানেল অনুসন্ধান ক্যোয়ারী সামঞ্জস্য করবেন) এবং এই দুর্দান্ত পৃষ্ঠাটি সন্ধান করার জন্য ডাব্লুপি_উসার_সুচুরি ডাব্লুপি_উজার_কিউয়ারি দ্বারা ৩.১: http://codex.wordpress.org/Class_References/WP_User_Query- কে অবমুক্ত করা হয়েছে ।


1

এখানে ওয়ার্ডপ্রেসের নতুন সংস্করণটির সমাধান।

add_action( 'pre_user_query', 'yoursite_pre_user_search'  );
    function yoursite_pre_user_search( $query ) {
        $query->query_where .= "YOUR QUERY '" . str_replace("*", "%", $query->query_vars[ 'search' ] ) . "')";
    }

-1

এটি আমি ওয়ার্ডপ্রেস 4.7.1 এর জন্য নিয়ে এসেছি যা সমস্ত ব্যবহারকারীর মেটা ডেটাতে ওয়াইল্ডকার্ড অনুসন্ধান যুক্ত করে।


add_action( 'pre_user_query', 'ds_pre_user_search'  );
function ds_pre_user_search( $query ) {
    global $wpdb;

    if( empty($_REQUEST['s']) ){return;}
    $query->query_from .= ' LEFT JOIN '.$wpdb->usermeta.' ON '.$wpdb->usermeta.'.user_id = '.$wpdb->users.'.ID';
    $query->query_where = "WHERE 1=1 AND (user_login LIKE '%".$_REQUEST['s']."%' OR ID = '".$_REQUEST['s']."' OR meta_value LIKE '%".$_REQUEST['s']."%')";
    return $query;
}

মূলত আমরা কেবল ব্যবহারকারীর আইডিতে ব্যবহারকারী এবং ব্যবহারকারী_মেটা টেবিলগুলিতে যোগদান করছি এবং মেটা_ভ্যালু কলামে অনুসন্ধান অন্তর্ভুক্ত করার জন্য WHERE ধারাটি পুনর্নির্মাণ করছি।


1
আপনি এখানে যা পরামর্শ দিচ্ছেন তা অত্যন্ত বিপজ্জনক ! আপনার ব্যবহারকারীর দ্বারা সরবরাহ করা সমস্ত কিছু ডিবিতে কখনই পাস করা উচিত নয় । তারা আপনার টেবিলগুলি ফেলে দিতে পারে, আপনার ডাটাবেস হাইজ্যাক করতে পারে - এসকিউএল ইনজেকশনটি অনুসন্ধান বাক্যাংশ হিসাবে দেখুন — বা আপনার সমস্ত ডেটা এনক্রিপ্ট করতে পারে। "%".like_escape( $_GET['s'] )."%"পরিবর্তে একটি করুন। একইভাবে অন্যান্য সমস্ত ব্যবহারকারী সরবরাহিত ডেটার ক্ষেত্রেও যায় । অন্যথায় আপনার অনুসন্ধানের ক্ষেত্রটি আপনার ডেটার একটি ওপেন গেটওয়েতে পরিণত হয়।
কায়সার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.