امکان فیلتر نوشته ها(Posts) براساس نویسنده در بخش مدیریت وردپرس

همانطور که می دانید در لیست “همه ی نوشته ها(All Posts)” در بخش مدیریت وردپرس می توانید نوشته ها را بر اساس تاریخ و دسته فیلتر(صافی) کنید. ما می خواهیم در این پست آموزشی علاوه بر موارد موجود، امکان فیلتر پست ها بر اساس نویسنده را به لیست نوشته ها اضافه کنیم.

امکان فیلتر پست های بر اساس نویسنده در وردپرس

برای انجام اینکار کدهای زیر را در فایل functions.php قرار دهید، توجه داشته باشید که این قابلیت برای صفحات و انواع پست های سفارشی(Custom Post Types) نیز فعال خواهد شد.

function filter_post_type_by_author() {
    $params = array(
        'name' => 'author', 
        'show_option_all' => 'همه نویسندگان'
    );
    if ( isset($_GET['user']) )
        $params['selected'] = $_GET['user'];

    wp_dropdown_users( $params );
}
add_action( 'restrict_manage_posts', 'filter_post_type_by_author' );

 

اگر می خواهید فقط کاربران دارای نقش مدیریت را در لیست نویسندگان نمایش دهید ساختار params$ را به صورت زیر مشخص نمائید، برای اطلاعات بیشتر درباره سایر پارامترها به WordPress Codex مراجعه کنید.

$params = array(
	'name' => 'author',
	'show_option_all' => 'همه نویسندگان',
	'role' => 'administrator'
);

 

برای اینکه بتوانید کاربران وردپرس را بر اساس نقشی(Role) که دارند گروه بندی کنید از کدهای زیر استفاده نمائید.

function filter_post_type_by_author() {
    global $wp_roles;
    $roles = $wp_roles->roles;
    if ( ! empty( $roles ) ) {
        echo '<select name="author"><option value="">همه نویسندگان</option>';
        foreach ( $roles as $role => $data ) {
            $users = get_users( 'orderby=display_name&role=' . $role );
            if ( ! empty( $users ) ) {
                echo '<optgroup label="' . esc_attr( ucfirst( $role ) ) . 's">';
                foreach ( $users as $user ) {
                    echo '<option value="' . absint( $user->ID ) . '"' . ( isset( $_GET['author'] ) && $user->ID == $_GET['author'] ? ' selected' : '' ) . '>' . $user->data->display_name . '</option>';
                }
                echo '</optgroup>';
            }
        }
        echo '</select>';
    }
}
add_action( 'restrict_manage_posts', 'filter_post_type_by_author' );

 

نتیجه نهایی در تصویر زیر نشان داده شده است.

گروه بندی کاربران وردپرس بر اساس نقش

فیلتر نوشته ها بر اساس نقش کاربری

برای اینکه بتوانید نوشته ها را بر اساس نقش کاربری هر فرد فیلتر نمائید کدهای زیر را در فایل functions.php قرار دهید.

function filter_posts_by_user_roles(){

    global $post_type;
    if( $post_type == 'post' ){

        $user_role  = '';
        $user_roles = array();
        foreach ( get_editable_roles() as $key => $values ) :
            $user_roles[ $key ] = $values['name'];
        endforeach;

        if ( ! empty( $_GET['user_role'] ) ) {
            $user_role  = sanitize_text_field( $_GET['user_role'] );
        }
        ?>
        <select name='user_role'>
        <option value=''>کلیه نقش ها</option>
            <?php
            foreach ( $user_roles as $key => $value ) :?>
                <option <?php selected( $user_role, $key ); ?> value='<?php echo $key; ?>'>
                         <?php echo translate_user_role( $value,'default' ); ?></option>
            <?php
            endforeach;
            ?>
        </select>
        <?php
    }
}
add_action( 'restrict_manage_posts', 'filter_posts_by_user_roles' );

function change_default_posts_query_for_user_roles( $query ) {

    if ( ! is_admin() ) {
        return;
    }

    global $pagenow;

    if ( 'edit.php' === $pagenow && 'post' === $query->query['post_type'] ) {

        if ( isset( $_GET['user_role'] ) ) {
            $role = $_GET['user_role'];
            $users   = new WP_User_Query( array( 'role' => $role ) );
            $results = $users->get_results();

            $user_ids = array();
            foreach( $results as $result ) {
                $user_ids[] = (int) $result->ID;
            }

            $user_ids = ! empty( $user_ids ) ? $user_ids : PHP_INT_MAX;

            $query->set( 'author__in', $user_ids );

        }
    }

}
add_action( 'pre_get_posts', 'change_default_posts_query_for_user_roles' );

 

خروجی نهایی را در تصویر زیر مشاهده می کنید.

فیلتر نوشته ها بر اساس نقش کاربری

نظرات و سوالات کاربران
  1. من از کد php برای شمارش بازدید استفاده می کنم (بدون افزونه شمارش بازدید). چکار کنم که تعداد بازدیدها رو جلوی هر مطلب در بخش مدیریت نوشته ها نشون بده؟

    1. سلام دوست عزیز
      از نمونه کد زیر استفاده کنید، در این مثال از custom field استفاده شده


      function add_view_count_column($defaults)
      {
      $defaults['post_view'] = 'تعداد بازدید';
      return $defaults;
      }
      add_filter('manage_posts_columns', 'add_view_count_column');

      function set_view_count_column($column_name, $post_ID)
      {
      if ($column_name == 'post_view') {
      $count = get_post_meta($post_ID, 'post_view_counter', true);
      echo !empty($count) ? $count : 0;
      }
      }
      add_action('manage_posts_custom_column', 'set_view_count_column', 10, 2);

      1. واقعا ممنونم
        کدی که دادید رو با کد قبلی شمارش بازدید سایت هماهنگ کردم و جواب داد. خود این کد، شمارش بازدید رو جداگونه انجام میداد.

  2. سلام وقت بخیر

    قربان چطور میشه به جای این که بر اساس نام کاربری قبلتر انجام بشه بر اساس نقش کاربری (role) این کار انجام بشه ؟

    یعنی مثلا اگر ما سه دسته کاربر داریم (۱و ۲و ۳) که تمام این ها اجازه نوشتن پست رو دارن ، چطور ما انتخاب کنیم که مثلا تمام پست هایی که مربوط به کاربران با نقش کاربری ۱ هست رو نشون بده . یا مثلا ۲ و …

  3. سلام وقت بخیر
    ممنون از سایت و مطالب خوبتون

    چطور میشه پست ها رو بر اساس چند دسته بندی جداگانه داخل سایت فیلتر کرد ؟

    برای مثال ما یه دسته بندی به عنوان استان در نظر میگیریم و نام استان ها رو به عنوان زیر دسته برای اون در نظر میگیریم ، یه دسته بندی جداگانه ب عنوان جنسیت و دو تا دسته بندی زن و مرد رو در نظر میگیریم و ی دسته بندی دیگه مثلا نوع خدمات با زیر دسته های تعمیر و رنگ و … و به هر پست این دسته بندی ها رو تخصیص میدیم . مثلا استان تهران جنسیت مرد و خدمات تعمیر .

    حالا کدی میخوام که مثلا سه تا dropdown داشته باشه و کاربرای سایت بتونن در سایت انتخاب کنن که تمام پست هایی با استان تهران جنسیت مرد و خدمات تعمیر رو بیاره براشون و یا مواردی از این دست .

    داخل سایت شما و جاهای دیگه رو خیلی گشتم ولی پیدا نکردم . ممنون میشم راهنمایی بفرمایید .

    1. سلام دوست عزیز، به نظر من اینکارو با فیلدهای سفارشی(Custom Fields) می تونید انجام بدید، فقط کدنویسی داره، با سه فیلد سفارشی نام استان، نوع خدمت و جنسیت. پیشنهاد میکنم مطلب چگونه از زمینه های دلخواه یا Custom Fields استفاده کنیم؟ رو مطالعه کنید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *