প্রশাসকের ব্যবহারকারীর তালিকায় কাস্টম পোস্ট প্রকার অনুসারে ব্যবহারকারীর পোস্ট গণনা দেখানো হচ্ছে?


9

আমি WPHonors.com-/wp-admin/users.php এ কাস্টম পোস্ট প্রকারের জন্য ব্যবহারকারীদের কতগুলি পোস্ট পোস্ট করতে হবে তা প্রদর্শনের জন্য কাস্টম কলামগুলি তৈরি করতে কীভাবে পরিচালনা পাতায় প্রবেশ করতে হবে তা জানার চেষ্টা করছি

আমি এটির জন্য একটি ট্র্যাকের টিকিট তৈরি করেছি তবে @ নাসিন ব্যাখ্যা করেছেন যে পরিবর্তে প্লাগইন করার জন্য এটি কেন আরও বেশি কাজ।

আমি ব্যবহারকারীর টেবিলের আউটপুট ম্যানিপুলেট করার কোনও উপায় খুঁজে পাচ্ছি না, তাই আমি প্রতিটি ব্যবহারকারীর জন্য সিপিটি পোস্টের গণনার জন্য কাস্টম কলামগুলি যুক্ত করতে পারি। এবং @ নাসিন জিজ্ঞাসা করা প্রশ্নটির সাথে এর কিছু যুক্ত থাকতে পারে, পোস্ট গণনা সংখ্যার সাথে কী লিঙ্ক থাকবে। বর্তমানের 'পোস্ট' পোস্ট গণনার জন্য কোনও ব্যবহারকারীর রয়েছে এটি পোস্ট ম্যানেজমেন্ট পৃষ্ঠায় লিঙ্ক করে, সেই ব্যবহারকারীর জন্য সমস্ত পোস্ট দেখিয়ে ( /wp-admin/edit.php?author=%author_id%)।

আমি যদি এটি অন্য কোথাও লিঙ্ক করতাম তবে তা হ'ল:

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%

এটি যদি কোনওভাবে সম্ভবও হত, আমার ধারণা। তবে এটিকে অন্য কোথাও লিঙ্ক করারও দরকার নেই। আমি বেশিরভাগই প্রতিটি ব্যক্তির জন্য কেবল সিপিটি পোস্ট গণনা প্রদর্শন করতে চাই, 600ব্যবহারকারী এবং কাস্টম পোস্ট ধরণের 300+জুড়ে সম্মিলিত মোট পোস্ট 4। প্রশাসকরা কেবল 'post'পোস্ট পোস্ট করতে পারেন , তাই ব্যবহারকারীর পৃষ্ঠায় থাকা কলামটি অকেজো।

উত্তর:


10

এখানে মাইকের টিউটোরিয়াল উত্তরের একটি প্রসার রয়েছে। আমি তালিকাবদ্ধ প্রকারের সাথে লিঙ্কগুলি যুক্ত করেছি যাতে আপনি একটিতে ক্লিক করতে পারেন এবং সেই লেখকের জন্য সেই ধরণের সমস্ত পোস্টের তালিকায় সরাসরি নিয়ে যেতে পারেন, যার জন্য অতিরিক্ত ভেরিয়েবলের প্রয়োজন হয় $countsএবং এর জন্য কিছু অতিরিক্ত আউটপুট প্রয়োজন$custom_column[]

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
    unset($column_headers['posts']);
    $column_headers['custom_posts'] = 'Assets';
    return $column_headers;
}

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
    if ($column_name=='custom_posts') {
        $counts = _yoursite_get_author_post_type_counts();
        $custom_column = array();
        if (isset($counts[$user_id]) && is_array($counts[$user_id]))
            foreach($counts[$user_id] as $count) {
                $link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
                // admin_url() . "edit.php?author=" . $user->ID;
                $custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
            }
        $custom_column = implode("\n",$custom_column);
        if (empty($custom_column))
            $custom_column = "<th>[none]</th>";
        $custom_column = "<table>\n{$custom_column}\n</table>";
    }
    return $custom_column;
}

function _yoursite_get_author_post_type_counts() {
    static $counts;
    if (!isset($counts)) {
        global $wpdb;
        global $wp_post_types;
        $sql = <<<SQL
        SELECT
        post_type,
        post_author,
        COUNT(*) AS post_count
        FROM
        {$wpdb->posts}
        WHERE 1=1
        AND post_type NOT IN ('revision','nav_menu_item')
        AND post_status IN ('publish','pending', 'draft')
        GROUP BY
        post_type,
        post_author
SQL;
        $posts = $wpdb->get_results($sql);
        foreach($posts as $post) {
            $post_type_object = $wp_post_types[$post_type = $post->post_type];
            if (!empty($post_type_object->label))
                $label = $post_type_object->label;
            else if (!empty($post_type_object->labels->name))
                $label = $post_type_object->labels->name;
            else
                $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
            if (!isset($counts[$post_author = $post->post_author]))
                $counts[$post_author] = array();
            $counts[$post_author][] = array(
                'label' => $label,
                'count' => $post->post_count,
                'type' => $post->post_type,
                );
        }
    }
    return $counts;
}

10

ধরে নিলাম আমি প্রশ্নটি বুঝতে পেরেছি, আপনাকে যা করতে হবে সেটি হ'ল অ্যাডমিনের পৃষ্ঠাগুলি পরিচালনা করার জন্য কলাম শিরোনাম এবং কলাম মান সম্পর্কিত দুটি হুক। তারা 'manage_{$type}_columns'এবং 'manage_{$type}_custom_column'আপনার ব্যবহারের ক্ষেত্রে {$type}কোথায় users

'manage_users_columns'হুক

এটি প্রথমটি সহজ, এটি আপনাকে কলামের শিরোনাম এবং তাই উপলব্ধ কলামগুলি উল্লেখ করতে দেয়। ওয়ার্ডপ্রেস "পোস্টস" কলামটির মানটিকে হার্ডকোড করে তাই আপনি এটি পরিবর্তন করতে চাইলে আমরা কেবল এটির সাথে সরিয়ে ফেলব unset()এবং তারপরে একই শিরোনাম সহ একটি নতুন কলাম যুক্ত করব যা পরিবর্তে এর শনাক্তকারী রয়েছে 'custom_posts':

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
  unset($column_headers['posts']);
  $column_headers['custom_posts'] = 'Posts';
  return $column_headers;
}

'manage_users_custom_column'হুক

এরপরে আপনাকে 'manage_users_custom_column'হুক ব্যবহার করতে হবে যা কেবল অ-মানক কলামগুলির জন্য ডাকা হবে। আমরা $column_name=='custom_posts'ভবিষ্যতে নতুন ব্যবহারকারীর কলাম যুক্ত করার ক্ষেত্রে আমাদের কোডটিকে শক্তিশালী করার জন্য পরীক্ষা করি এবং তারপরে আমি লিখেছি _yoursite_get_author_post_type_counts()যে ফাংশনটি আমি লিখেছি তার থেকে ব্যবহারকারীর পোস্টের ধরণগুলি ধরে ফেলব। আমি তখন এই ফরম্যাট করতে কয়েকটি উপায় সঙ্গে অভিনয় কিন্তু সিদ্ধান্ত নিয়েছে একটি HTML <table>সবচেয়ে উপযুক্ত ছিল (যেহেতু হয় ডেটার একটি টেবিল) । যদি কোনও টেবিল আপনার জন্য কাজ না করে আমি ধরে নিই যে আপনি খুব সহজেই বিভিন্ন মার্কআপ উত্পন্ন করতে সক্ষম হবেন:

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
  if ($column_name=='custom_posts') {
    $counts = _yoursite_get_author_post_type_counts();
    $custom_column = array();
    if (isset($counts[$user_id]) && is_array($counts[$user_id]))
      foreach($counts[$user_id] as $count)
        $custom_column[] = "\t<tr><th>{$count['label']}</th>" .
                                 "<td>{$count['count']}</td></tr>";
    $custom_column = implode("\n",$custom_column);
  }
  if (empty($custom_column)) 
    $custom_column = "No Posts!";
  else 
    $custom_column = "<table>\n{$custom_column}\n</table>";
  return $custom_column;
}

প্রতিটি ব্যবহারকারীর / লেখকের জন্য পোস্টের ধরণের মাধ্যমে পোস্টের গণনা পাওয়া

সবশেষে লেখক / ব্যবহারকারীর পোস্ট টাইপ অনুসারে পোস্ট গণনাগুলির পুনরুদ্ধার রয়েছে। সাধারণত WP_Query()পোস্টগুলিতে অনুসন্ধান চলমান থাকাকালীন আমি ব্যবহারের সাথে লেগে থাকার চেষ্টা করি তবে এই কোয়েরিতে আরও অনেক হুক ব্যবহার করা দরকার হত "দুষ্টু" হওয়া এবং এটি একটিতে সবই করা সহজ মনে হয়েছিল।

আমি কোন পোস্টে বাদ দেওয়া $post->post_typeহয় 'revision'অথবা 'nav_menu_item'কিন্তু বাকি 'attachments'। আমার করা কয়েকটি বাদ না দিয়ে আপনি যে পোস্টের পোস্ট চান তা স্পষ্টভাবে অন্তর্ভুক্ত করা আপনার পক্ষে ভাল বলে মনে হতে পারে।

আমি $post->post_statusকেবল 'publish'এবং এর জন্যও ফিল্টার করেছি 'pending'। আপনি যদি অন্তর্ভুক্ত করতে চান 'future', 'private'এবং / অথবা 'draft'আপনার কোডটিতে পরিবর্তনগুলি করতে হবে।

প্রতিটি পৃষ্ঠা লোডের জন্য আমি কেবল _yoursite_get_author_post_type_counts()একবার এই ফাংশনটি কল করি এবং তারপরে প্রতিটি ব্যবহারকারীর জন্য কল করার চেয়ে স্থিতিশীল ভেরিয়েবলের মধ্যে সঞ্চয় করি। আমি লেখক / ব্যবহারকারী আইডি দ্বারা সূচিত একটি অ্যারেতে পোস্ট উপাদানের সাথে পোস্ট টাইপের নাম সহ একটি অ্যারে ধারণ করে 'label'এবং অবশ্যই একই নামযুক্ত উপাদানটিতে গণনা:

function _yoursite_get_author_post_type_counts() {
  static $counts;
  if (!isset($counts)) {
    global $wpdb;
    global $wp_post_types;
    $sql = <<<SQL
SELECT
  post_type,
  post_author,
  COUNT(*) AS post_count
FROM
  {$wpdb->posts}
WHERE 1=1
  AND post_type NOT IN ('revision','nav_menu_item')
  AND post_status IN ('publish','pending')
GROUP BY
  post_type,
  post_author
SQL;
    $posts = $wpdb->get_results($sql);
    foreach($posts as $post) {
      $post_type_object = $wp_post_types[$post_type = $post->post_type];
      if (!empty($post_type_object->label))
        $label = $post_type_object->label;
      else if (!empty($post_type_object->labels->name))
        $label = $post_type_object->labels->name;
      else
        $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
      if (!isset($counts[$post_author = $post->post_author]))
        $counts[$post_author] = array();
      $counts[$post_author][] = array(
        'label' => $label,
        'count' => $post->post_count,
        );
    }
  }
  return $counts;
}

ফলাফল ইউআই

ওয়ার্ডপ্রেস .1.০.১ এর আমার পরীক্ষার ইনস্টলটিতে এটি প্রয়োগ করা মনে হচ্ছে:


(সূত্র: মাইকসচিনেল.কম )

সম্পূর্ণ কোডটি ডাউনলোড করুন

আপনি জিস্ট থেকে সম্পূর্ণ কোডটি ডাউনলোড করতে পারেন :

আপনি এই থিমের functions.phpফাইলটিতে এই কোডটি অনুলিপি করতে পারেন বা আপনি যে কোনওটিকেই বেছে নিন কোনও প্লাগইনে ফাইলটি স্টোর করতে পারেন।

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


ঠিক আছে, সহজ। আপনাকে যা করতে হয়েছিল তা হ'ল এটি 'ম্যানেজ _ {$ টাইপ} _ কলামগুলি' এবং 'ম্যানেজ _ {$ টাইপ} _ কাস্টম_ক্লোনম' ব্যবহার করে যেখানে $ প্রকার = ব্যবহারকারী, এবং আমি সেখান থেকে বাকীগুলি বের করতে পারতাম। আমার এটির অনুভূতি ছিল, তবে আমি এটি যাচাই করেছিলাম এবং ব্যবহারকারীদের দেখিনি। বাকিগুলি যথেষ্ট সহজ। আপনি এটিতে যে বিস্তৃত প্রচেষ্টা করেছেন তাতে আমি তার প্রশংসা করি এবং আমি আপনার জন্য WPHonors এ ভোট দেওয়ার বিষয়ে নিশ্চিত হয়েছি (যেহেতু আমার কাছে ইতিমধ্যে আছে) goo.gl/CrSi ধন্যবাদ অনেক কিছুই: ডি
জারেডুইলি

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

হ্যাঁ এজন্যই আমি আপনাকে কেবল আমার ব্যবহার করা হুক বলতে বলি তা থামাইনি। আমি জানি আমি এর জন্য প্রয়োজনীয় সন্ধানের একমাত্র ব্যক্তি হব না এটি সব ভাল।
jaredwilli

ওহ দুঃখিত, অবশ্যই আমি করব। আমি একটি শপিং সাইট ইম বিল্ডিংয়ের জন্য কাস্টম পোস্ট টাইপ ইম তৈরি করে আমার বিভ্রান্ত হয়েছিল। আমি মনে করি না যে আপনি কোনও পোস্টকে একটি সম্পাদনা.পিএফপি পৃষ্ঠার সাথে লেখকের জন্য একটি পোস্ট দেখিয়ে লিঙ্ক করার কোনও উপায় খুঁজে পেয়েছেন? সম্ভবত আমার সিপিটি ইম অনুমান করে এটি তৈরি করা দরকার।
jaredwilli

@ জারেদ্বিল্লি - আহ, হ্যাঁ, তবে দেখে মনে হচ্ছে @ স্বতঃস্ফূর্তভাবে এটি আপনার জন্য করেছে?
মাইকচিনকেলে

2

নীচে সরিচ ৮'s এর উত্তরের একটি প্রকরণ রয়েছে, কারণ আমি তার কাজ করতে পারিনি, এবং আমি স্বয়ংক্রিয়ভাবে একাধিক ধরণের সমর্থন করতে চেয়েছিলাম:

function my_manage_users_custom_column($output = '', $column, $user_id) {
    global $wpdb;
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
    return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    // create columns for each type, make sure to use the post_type slug
    $columns['animals'] = 'Animals Count';
    $columns['plants'] = 'Plants Count';
    $columns['insects'] = 'Insect Count';
    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

আমি পড়েছি get_posts_by_author_sql()এবং এটি আপনার পক্ষে যেখানে একটি বিবৃতি তৈরি করার কথা, কিন্তু আমি যে ফলাফল পেয়েছি তা সবসময় "1 = 0" ছিল। সুতরাং আমি কেবলমাত্র এসকিউএল বাকী বাক্যটি লিখেছিলাম, যেমন get_posts_by_author_sql()আপনাকে দুটি বিট লিখতে হবে: পোষ্টের ধরণ এবং লেখক:

"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"

এটি ঠিক তেমনি কাজ করে এবং আপনার পছন্দমতো কলামগুলি যুক্ত করবে, তবে প্রত্যেকে অনুভূমিক স্থান ব্যবহার করবে, যেখানে মাইকের টিউটোরিয়ালটি কাস্টম পোস্ট ধরণের জন্য একটি একক কলাম যুক্ত করবে এবং তারপরে সেটিকে সারিটির মধ্যে একটি টেবিল হিসাবে তালিকাবদ্ধ করবে। একই তথ্য, বিভিন্ন ভিজ্যুয়ালাইজেশন। মাইকের সংক্ষিপ্ততর আকারের জন্য সম্ভবত এটি আরও ভাল, কারণ এটি একটি ঘনীভূত উল্লম্ব তালিকা তৈরি করে (এবং খালি না হলে কেবল একটি গণনা আইটেম প্রদর্শন করে), যখন সরিচ ৮'s এর পদ্ধতিটি ছোট পরিমাণে ভাল, কারণ কেবলমাত্র এতগুলি অনুভূমিক কলাম কক্ষ উপলব্ধ।

ভুলে যাবেন না যে আপনি কেবল প্রকাশিত আইটেমগুলি ফিরিয়ে দিতে ক্যোয়ারিতে "post_status = প্রকাশ" যুক্ত করতে পারেন, উদাহরণ হিসাবে বর্তমানে সমস্ত পোস্ট ফিরে আসে ...


গ্রেট! get_posts_by_author_sql( $column, true, $user_id );যেখানে বিবৃতি নির্মাণ করা উচিত।
sorich87

1

নিম্নলিখিত এটি যুক্ত করবে:

function my_manage_users_custom_column($output = '', $column_name, $user_id) {
    global $wpdb;

    if( $column_name !== 'post_type_count' )
        return;

    $where = get_posts_by_author_sql( 'post_type', true, $user_id );
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

    return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    $columns['post_type_count'] = __( 'Post Type', 'textdomain' );

    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

@ সরিচ ৮87 - get_posts_by_author_sql()এহ? সে আমার কাছে নতুন; ধন্যবাদ! তবে আমি কেবল আপনার কোডটি যাচাই করেছি এবং আমার মনে হয়না সে এটি প্রত্যাশা করে যা করে does আপনার get_posts_by_author_sql()কলটি সর্বদা ফিরে আসে '1=0', এবং তিনি কোনও ব্যবহারকারীর জন্য পোস্টের ধরণের মাধ্যমে গণনাগুলির একটি তালিকা পেতে চেয়েছিলেন; যদি না আমি ভুল বুঝি এই কোডটি এটি করে না। আপনি এটি ঠিক করতে পারেন?
মাইকচিন্কেল

হ্যাঁ, আমি প্রশ্নটি ভুল বুঝেছি। আমার কোডটি কেবলমাত্র একটি কাস্টম পোস্ট ধরণের জন্য একটি কলাম যুক্ত করবে। কেবলমাত্র post_typeপোস্টের নাম দ্বারা প্রতিস্থাপন করুন । উদাহরণস্বরূপ: get_posts_by_author_sql( 'book', true, $user_id );'বই' নামক পোস্টের জন্য। পরীক্ষিত এবং এটি কাজ করে।
sorich87

পিএস: ডাব্লুপিওনার্সে আপনাকে ভোট দিয়েছিল। আপনি অবশ্যই এটি প্রাপ্য!
sorich87

আমি এখনও এটি পরীক্ষা করে দেখতে পেলাম, তবে দেখে মনে হচ্ছে এটি কার্যকর হবে, আমি যে সমস্ত কার্যকারিতা সন্ধান করছি তা নাও থাকতে পারে, তবে এখনও যুক্ত করা সহজ। ধন্যবাদ :)
jaredwilli

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