ব্যবহারকারীকে কেবলমাত্র নির্দিষ্ট পৃষ্ঠাগুলি সম্পাদনা করার অনুমতি দিচ্ছে


16

আমি নির্দিষ্ট ব্যবহারকারীকে কেবল একটি পৃষ্ঠা সম্পাদনা করার অনুমতি দিতে চাই এবং এটির উপ পৃষ্ঠাগুলি ages এটা কীভাবে সম্ভব হবে? আমি পুরানো রোল স্কোপার চেষ্টা করেছিলাম তবে মনে হচ্ছে এতে অনেক সমস্যা এবং বাগ রয়েছে।


2
আমি প্লাগইন সুপারিশের জন্য আপনার অনুরোধটি সরিয়ে দিয়েছি কারণ এটি প্রশ্নটিকে অফ-টপিক তৈরি করেছে। হ্যাঁ, এটি একটি প্লাগইন দিয়েই সম্ভব হওয়া উচিত তবে যখন আমি এমন কিছু করার চেষ্টা করি যখন এই ধরণের মৌলিক কার্যকারিতা হ্যাকিংয়ের প্রয়োজন হয় তখন আমি সহায়তা করতে পারি না তবে মনে হয় আপনি ভুল পদ্ধতির দিকে চলেছেন। আপনি কি আরও বিস্তারিতভাবে প্রকল্পটি ব্যাখ্যা করতে পারেন?
s_ha_dum

উত্তর:


14

এই জাতীয় কার্য সম্পাদন করতে প্রথমে কাজটি হ'ল কোনও ব্যবহারকারী কোন পৃষ্ঠা সম্পাদনা করতে পারে তা সনাক্ত করতে সক্ষম হবেন।

এটি করার বিভিন্ন উপায় রয়েছে। এটি কোনও ব্যবহারকারীর মেটা, কিছু কনফিগারেশন মান হতে পারে ... এই উত্তরের জন্য, আমি ধরে নেব যে একটি ফাংশন লিল এটি উপস্থিত রয়েছে:

function wpse_user_can_edit( $user_id, $page_id ) {

   $page = get_post( $page_id );

   // let's find the topmost page in the hierarchy
   while( $page && (int) $page->parent ) {
     $page = get_post( $page->parent );
   }

   if ( ! $page ) {
     return false;
   }

   // now $page is the top page in the hierarchy
   // how to know if an user can edit it, it's up to you...

}

এখন যেহেতু কোনও ব্যবহারকারী কোনও পৃষ্ঠা সম্পাদনা করতে পারে তা নির্ধারণের একটি উপায় আমাদের কেবলমাত্র একটি পৃষ্ঠা সম্পাদনা করার জন্য ব্যবহারকারীর সক্ষমতা যাচাই করতে এই ফাংশনটি ব্যবহার করার জন্য ওয়ার্ডপ্রেসকে বলা দরকার।

'map_meta_cap'ফিল্টার মাধ্যমে এটি করা যেতে পারে ।

কিছুটা এইরকম:

add_filter( 'map_meta_cap', function ( $caps, $cap, $user_id, $args ) {

    $to_filter = [ 'edit_post', 'delete_post', 'edit_page', 'delete_page' ];

    // If the capability being filtered isn't of our interest, just return current value
    if ( ! in_array( $cap, $to_filter, true ) ) {
        return $caps;
    }

    // First item in $args array should be page ID
    if ( ! $args || empty( $args[0] ) || ! wpse_user_can_edit( $user_id, $args[0] ) ) {
        // User is not allowed, let's tell that to WP
        return [ 'do_not_allow' ];
    }
    // Otherwise just return current value
    return $caps;

}, 10, 4 );

এই মুহুর্তে, একজনকে এক বা একাধিক পৃষ্ঠায় যুক্ত করার জন্য আমাদের কেবল একটি উপায় প্রয়োজন ।

ব্যবহারের ক্ষেত্রে নির্ভর করে বিভিন্ন সমাধান হতে পারে।

একটি নমনীয় সমাধান হ'ল wp_dropdown_pagesসম্পাদনা ব্যবহারকারীর অ্যাডমিন স্ক্রিনে "রুট" পৃষ্ঠাগুলির একটি ড্রপডাউন যুক্ত করা (দেখুন ) এবং নির্বাচিত পৃষ্ঠাগুলি ব্যবহারকারীর মেটা হিসাবে সংরক্ষণ করতে পারে।

আমরা 'edit_user_profile'পৃষ্ঠাগুলি ড্রপডাউন ক্ষেত্র যুক্ত করতে এবং 'edit_user_profile_update'নির্বাচিত মানটিকে ব্যবহারকারীর মেটা হিসাবে সঞ্চয় করতে সহায়তা করতে পারি।

আমি নিশ্চিত যে এই ওয়েবসাইটে বিস্তারিতভাবে কীভাবে করা যায় সে সম্পর্কে পর্যাপ্ত দিকনির্দেশনা রয়েছে।

পৃষ্ঠা (গুলি) ব্যবহারকারীর মেটা হিসাবে সংরক্ষণ করা হয়, wpse_user_can_edit()পৃষ্ঠার আইডি ব্যবহারকারীর মেটা মানের অংশ কিনা তা পরীক্ষা করে উপরে থেকে ফাংশনটি শেষ করা যায়।

পৃষ্ঠা সম্পাদনা করার ক্ষমতা অপসারণ, ওয়ার্ডপ্রেস বাকীটি করবে: ব্যাকএন্ড এবং ফ্রন্টএন্ড থেকে যে কোনও সম্পাদনা লিঙ্ক সরিয়ে দেবে, সরাসরি অ্যাক্সেস প্রতিরোধ করবে ... ইত্যাদি।


3
এটি আমার উত্তরের চেয়ে অনেক ভাল। আপনি যখন ব্যবহারকারীর সক্ষমতা কেবলমাত্র সংশোধন করতে পারেন এবং ওয়ার্ডপ্রেসকে বাকিগুলি পরিচালনা করতে পারেন কেন কেন সম্পাদনা লিঙ্কগুলিকে সীমাবদ্ধ রাখুন?
রিচোথেক

আপনার "ইউ" শব্দের আগে "ব্যবহারকারীর" "না" শব্দের ব্যবহার করা উচিত কারণ একটি দীর্ঘ "ইউ" "ইউ" এর মতো মনে হয় যা ব্যঞ্জনবর্ণ দিয়ে শুরু হয়।
ফিলিপ

7

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

$user_edit_limit = new NS_User_Edit_Limit(
    15,       // User ID we want to limit
    [2, 17]   // Array of parent page IDs user is allowed to edit
                 (also accepts sub-page IDs)
);

class NS_User_Edit_Limit {

    /**
     * Store the ID of the user we want to control, and the
     * posts we will let the user edit.
     */
    private $user_id = 0;
    private $allowed = array();

    public function __construct( $user_id, $allowed ) {

        // Save the ID of the user we want to limit.
        $this->user_id = $user_id;

        // Expand the list of allowed pages to include sub pages
        $all_pages = new WP_Query( array(
            'post_type' => 'page',
            'posts_per_page' => -1,
        ) );            
        foreach ( $allowed as $page ) {
            $this->allowed[] = $page;
            $sub_pages = get_page_children( $page, $all_pages );
            foreach ( $sub_pages as $sub_page ) {
                $this->allowed[] = $sub_page->ID;
            }
        }

        // For the prohibited user...
        // Remove the edit link from the front-end as needed
        add_filter( 'get_edit_post_link', array( $this, 'remove_edit_link' ), 10, 3 );
        add_action( 'admin_bar_menu', array( $this, 'remove_wp_admin_edit_link' ), 10, 1 );
        // Remove the edit link from wp-admin as needed
        add_action( 'page_row_actions', array( $this, 'remove_page_list_edit_link' ), 10, 2 );
    }

    /**
     * Helper functions that check if the current user is the one
     * we want to limit, and check if a specific post is in our
     * list of posts that we allow the user to edit.
     */
    private function is_user_limited() {
        $current_user = wp_get_current_user();
        return ( $current_user->ID == $this->user_id );
    }
    private function is_page_allowed( $post_id ) {
        return in_array( $post_id, $this->allowed );
    }

    /**
     * Removes the edit link from the front-end as needed.
     */
    public function remove_edit_link( $link, $post_id, $test ) {
        /**
         * If...
         * - The limited user is logged in
         * - The page the edit link is being created for is not in the allowed list
         * ...return an empty $link. This also causes edit_post_link() to show nothing.
         *
         * Otherwise, return link as normal.
         */
        if ( $this->is_user_limited() && !$this->is_page_allowed( $post_id ) ) {
            return '';
        }
        return $link;
    }

    /**
     * Removes the edit link from WP Admin Bar
     */
    public function remove_wp_admin_edit_link( $wp_admin_bar ) {
        /**
         *  If:
         *  - We're on a single page
         *  - The limited user is logged in
         *  - The page is not in the allowed list
         *  ...Remove the edit link from the WP Admin Bar
         */
        if ( 
            is_page() &&
            $this->is_user_limited() &&
            !$this->is_page_allowed( get_post()->ID )
        ) {
            $wp_admin_bar->remove_node( 'edit' );
        }
    }

    /**
     * Removes the edit link from WP Admin's edit.php
     */
    public function remove_page_list_edit_link( $actions, $post ) {
        /**
         * If:
         * -The limited user is logged in
         * -The page is not in the allowed list
         * ...Remove the "Edit", "Quick Edit", and "Trash" quick links.
         */
        if ( 
            $this->is_user_limited() &&
            !$this->is_page_allowed( $post->ID )
        ) {
            unset( $actions['edit'] );
            unset( $actions['inline hide-if-no-js']);
            unset( $actions['trash'] );
        }
        return $actions;
    }
}

উপরের কোডটি যা করে তা হ'ল নিম্নলিখিতটি কাজ করা বা প্রয়োজন হিসাবে প্রদর্শিত হওয়া থেকে বিরত রাখা:

  1. get_edit_post_link
  2. Edit Page পৃষ্ঠাগুলির জন্য উপস্থিত WP অ্যাডমিন বারের লিঙ্ক
  3. Edit, Quick Editএবং Trashদ্রুত লিঙ্কগুলি যা পৃষ্ঠাগুলির নীচে প্রদর্শিত হয়/wp-admin/edit.php?post_type=page

এটি আমার স্থানীয় ওয়ার্ডপ্রেস 4.7 ইনস্টল এ কাজ করেছে। ধরে নিই যে সাইটের পৃষ্ঠাগুলি প্রায়শই পরিবর্তন হয় না, পৃষ্ঠার আইডি এবং এর উপ-পৃষ্ঠাগুলি হার্ডকোড করা এবং পদ্ধতির WP_Queryঅভ্যন্তরটি সরিয়ে ফেলা ভাল __construct। এটি ডাটাবেস কলগুলিতে অনেক সাশ্রয় করবে।


@ বেনের চেয়ে আরও সম্পূর্ণ উত্তরের জন্য +1 কিন্তু লিঙ্কগুলি হ্যান্ডেল করার সঠিক উপায় হ'ল ক্ষমতাগুলি হ'ল
মার্ক কপলুন

হ্যাঁ, আমি যখন গাজাজাপের উত্তর দেখেছি তখন আমি ভাবছিলাম "এখন আমি কেন এটি ভেবে দেখিনি?"
রিকোথেক

5

আপনি যদি প্লাগইন থেকে দূরে রাখতে চান, তবে আপনি একটি ফাংশন.এফপি ফাইল বা একটি কাস্টম প্লাগইনে নীচের কোডের বিভিন্নতা রাখতে পারেন।

এই কোডটির 2 টি পৃথক অংশ রয়েছে, আপনার কেবল তার মধ্যে 1 টি ব্যবহার করা দরকার তবে কোনটি প্রয়োজনীয়তার জটিলতার উপর নির্ভর করে।

পার্ট 1 কোনও একক ব্যবহারকারীকে নির্দিষ্ট করে এবং তাদের নির্দিষ্ট পোস্টে সীমাবদ্ধ করে।

পার্ট 2 আপনাকে ব্যবহারকারীদের একটি মানচিত্র তৈরি করতে এবং আইডি পোস্ট করার অনুমতি দেয় এবং একাধিক পোস্টের অনুমতি দেয়

নীচের কোডটি কেবলমাত্র একটি পৃষ্ঠার জন্য, তবে আপনি যদি এটি কোনও পোস্টে বা কাস্টম পোস্টের ধরণে পরিবর্তন করতে চান তবে আপনার স্ট্রিংটিকে $screen->id == 'page'অন্য কোনও কিছুতে পরিবর্তন করতে হবে।

আপনি এখানে ডাব্লুপি-অ্যাডমিনের কাছাকাছি স্ক্রিন আইডির একটি রেফারেন্স খুঁজে পেতে পারেন

function my_pre_get_posts( $query ){

    $screen = get_current_screen();
    $current_user = wp_get_current_user();

    /**
     * Specify a single user and restrict to a single page
     */
    $restricted_user_id = 10; //User ID of the restricted user
    $allowed_post_id = 1234; //Post ID of the allowed post

    $current_post_id = isset( $_GET['post'] ) ? (int)$_GET['post'] : false ;

    //Only affecting a specific user
    if( $current_user->ID !== $restricted_user_id ){
        return;
    }

    //Only Affecting EDIT page.
    if( ! $current_post_id ){
        return;
    }

    if( $screen->id == 'page' && $current_post_id !== $allowed_post_id ){
        wp_redirect( admin_url( ) );
        exit;
    }

    /**
     * Specify a map of user_id => $allowed_posts
     */
    $restrictions_map = [
        10 => [ 123 ], //Allow user ID to edit Page ID 123
        11 => [ 152, 186 ] //Allow user ID to edit Page ID 123 and 186
    ];

    if( array_key_exists( $current_user->ID, $restrictions_map ) ){

        $allowed_posts = $restrictions_map[$current_user->ID];

        if( $screen->id == 'page' && ! in_array( $current_user->ID, $allowed_posts ) ){
            wp_redirect( admin_url( ) );
            exit;
        }

    }

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

1
+1 এটি মূল কার্যকারিতাটি করতে কাজ করতে পারে তবে এটি পৃষ্ঠাগুলিকে আউটপুট হিসাবে সম্পাদনা করার লিঙ্কগুলিকে ছেড়ে দেয় এমনকি এমন ব্যবহারকারীদের কাছেও সম্পাদনা করতে পারে না যা খারাপ ইউআই তৈরি করে
মার্ক কাপালুন

-4

আমি User Role Editorকয়েকবার ব্যবহার করেছি এবং বেশ ভাল। সম্ভবত এটি আপনাকেও সহায়তা করতে পারে। এখানে ইউজার রোল এডিটর লিংক দেওয়া আছে


একটি দৃ plugin় প্লাগইন বলে মনে হচ্ছে, তবে কীভাবে কোনও ব্যবহারকারীকে সুনির্দিষ্ট পৃষ্ঠাগুলি সম্পাদনা করতে সীমাবদ্ধ রাখার উপায় খুঁজে পাচ্ছি না।
নাফ

আপনি ব্যবহারকারীদের এইভাবে সীমাবদ্ধ রাখতে চান তাদের লেখক-স্তরের ব্যবহারকারীরা সক্ষম করতে সক্ষম হন "edit_pages" লেখক ব্যবহারকারী স্তরে (ব্যবহারকারীর ভূমিকা সম্পাদক ব্যবহার করে) কোনও পৃষ্ঠার লেখককে আপনি যে সম্পাদনা করার সুযোগ দিতে চান তাতে সেট করুন। সম্পাদনা পৃষ্ঠাগুলির সক্ষমতা প্রদত্ত কোনও লেখক স্তরের ব্যবহারকারী ড্যাশবোর্ডে থাকা পৃষ্ঠাগুলির তালিকা দেখতে পাবে, তবে তারা যে পৃষ্ঠাগুলির লেখক সেগুলি বাদ দিয়ে সম্পাদনার বিকল্প নেই।
ব্যবহারকারী 2319361

4
ধন্যবাদ, এটি একটি পরিমাণে কাজ করে। এক পর্যায়ে আমার কাছে একটি নির্দিষ্ট পৃষ্ঠা সংশোধন করার জন্য একাধিক ব্যবহারকারীকে সীমাবদ্ধ থাকতে হবে, সুতরাং কোনও পৃষ্ঠায় একাধিক লেখককে সেট করার উপায় থাকতে হবে।
নাফ

ব্যবহারকারীদের নির্দিষ্ট পৃষ্ঠাগুলিতে সীমাবদ্ধ রাখার জন্য আপনাকে প্রো ভার্সুইন কিনতে হবে। আমি একই জিনিসটি খুঁজছি এবং এটি খুঁজে পেয়েছি। ওয়ার্ডপ্রেস.স্ট্যাকেক্সেঞ্জাওয়েজ.কোশনস
রিকার্ডো আন্দ্রেস

1
যদিও সেই নির্দিষ্ট প্লাগইনটি এখনই একটি শক্ত জিনিস, প্লাগিন অফার করে এমন সমস্ত বিকল্পের ওয়েডের চেয়ে কোড লেখার পক্ষে এটি করা সম্ভবত সহজ। (যদি এটি আপনাকে ওপি যা বলে তা করতে দেয়)
মার্ক কপলুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.