Plugin Directory

Changeset 3479600


Ignore:
Timestamp:
03/10/2026 11:07:44 PM (3 weeks ago)
Author:
softtent
Message:

Updated: EditX Functionality

Location:
editx
Files:
91 added
8 edited

Legend:

Unmodified
Added
Removed
  • editx/trunk/README.txt

    r3478674 r3479600  
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 0.1.0
     7Stable tag: 0.1.1
    88License: GPL-2.0-or-later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    1111Author URI: https://softtent.com
    1212
    13 A customization plugin for WordPress
     13Customize your WordPress admin — edit menus, manage table columns, and restrict access by user or role.
    1414
    1515== Description ==
    16 EditX is a simple, yet powerful customization plugin for WordPress. It's easy to customize and extend according to your needs.
     16
     17EditX gives WordPress administrators full control over the admin experience. Customize the admin menu layout, choose which columns appear in list tables, and restrict access to menu items for specific users or roles — all from a clean, modern interface.
     18
     19**Admin Menu Editor**
     20Drag and rearrange admin menu items, hide menus you don't need, and reorder submenus to match your workflow. Changes are stored and applied on every page load.
     21
     22**Admin Column Editor**
     23Choose exactly which columns appear in your admin list tables — Posts, Pages, Media, Comments, Users, and all custom post types. Remove clutter and focus on the data that matters.
     24
     25**Manage Restrictions**
     26Restrict which admin menu items are visible to specific users or roles. Role-based restrictions apply to everyone in that role; user-level restrictions override role settings for individual users. Administrators are always protected from restriction.
     27
     28**Addons**
     29Each feature is a toggleable addon. Enable or disable Admin Menu Editor, Admin Column Editor, and Restrictions independently from the Addons screen.
    1730
    1831== Installation ==
    19 1. Upload `editx` to the `/wp-content/plugins/` directory.
    20 2. Activate the plugin through the 'Plugins' menu in WordPress.
    21 3. Start using the plugin or develop it further as per your requirements.
     32
     331. Upload the `editx` folder to the `/wp-content/plugins/` directory.
     342. Activate the plugin through the **Plugins** menu in WordPress.
     353. Navigate to **Dashboard > EditX** to get started.
    2236
    2337== Frequently Asked Questions ==
    2438
    25 = How to use this plugin =
     39= How do I edit the admin menu? =
    2640
    27 * Go to Dashboard > EditX > Admin Menu Editor.
    28 * Go to Dashboard > EditX > Admin Column Editor.
     41Go to **Dashboard > EditX > Admin Menu Editor**. You can reorder and customize admin menus from there.
     42
     43= How do I customize table columns? =
     44
     45Go to **Dashboard > EditX > Admin Column Editor**. Select the screen you want to customize and toggle the columns you need.
     46
     47= How do I restrict menu access for a role? =
     48
     49Go to **Dashboard > EditX > Manage Restrictions**, choose the **Roles** tab, select a role, and configure which menus they can access.
     50
     51= Can I restrict access for a specific user? =
     52
     53Yes. Under **Manage Restrictions**, switch to the **Users** tab and configure access for an individual user. User-level settings override role-level settings.
     54
     55= Can I disable a feature I don't need? =
     56
     57Yes. Go to **Dashboard > EditX > Addons** and toggle any addon on or off.
    2958
    3059= Where can I find documentation? =
    31 For detailed documentation, visit [https://softtent.com](https://softtent.com).
    3260
    33 = Need Any Help? =
     61Visit [https://softtent.com](https://softtent.com) for full documentation.
    3462
    35 * Please mail us at `contact@softtent.com`
     63= Need help? =
     64
     65Email us at `contact@softtent.com`
     66
     67== Screenshots ==
     68
     691. Admin Menu Editor — reorder and customize admin menus
     702. Admin Column Editor — manage columns in list tables
     713. Manage Restrictions — restrict menu access by role or user
     724. Addons — enable or disable individual features
    3673
    3774== Changelog ==
     75
     76= 0.1.1 =
     77* Updated: Admin Menu Editor
     78* Updated: Admin Column Editor
     79* Updated: Manage Restrictions
     80
    3881= 0.1.0 =
    3982* Initial release.
    4083
    4184== Upgrade Notice ==
    42 = 0.1.0 =
    43 This is the first version of EditX.
    4485
    45 == Screenshots ==
    46 1. Admin Menu Editor
    47 2. Admin Column Editor
     86= 0.1.1 =
     87* Updated: Admin Menu Editor
     88* Updated: Admin Column Editor
     89* Updated: Manage Restrictions
    4890
    4991== Additional Information ==
    50 For more information and updates, visit the official website [https://softtent.com](https://softtent.com).
     92
     93For more information and updates, visit [https://softtent.com](https://softtent.com).
    5194
    5295== License ==
     96
    5397This plugin is licensed under the GPL-2.0-or-later License.
    54 
    55 == Source Code ==
    56 The source code for this plugin can be found on [GitHub](https://github.com/softtent/editx). All development instructions are mentioned there.
  • editx/trunk/editx.php

    r3478674 r3479600  
    1111 * Plugin Name:       EditX
    1212 * Plugin URI:        https://wordpress.org/plugins/editx
    13  * Description:       A customization plugin for WordPress
    14  * Version:           0.1.0
     13 * Description:       A admin menu editor, admin column editor, and admin access control plugin for WordPress
     14 * Version:           0.1.1
    1515 * Author:            SoftTent
    1616 * Author URI:        https://softtent.com
     
    131131     */
    132132    public function define_constants() {
    133         define( 'EDITX_VERSION', '0.1.0' );
     133        define( 'EDITX_VERSION', '0.1.1' );
    134134        define( 'EDITX_SLUG', 'editx' );
    135135        define( 'EDITX_FILE', __FILE__ );
     
    138138        define( 'EDITX_URL', plugins_url( '', EDITX_FILE ) );
    139139        define( 'EDITX_TEMPLATE_PATH', EDITX_PATH . '/templates' );
    140         define( 'EDITX_ASSETS', EDITX_URL . '/assets' );
     140        define( 'EDITX_ASSETS', EDITX_URL . '/build' );
    141141    }
    142142
  • editx/trunk/includes/Admin/Menu.php

    r3478674 r3479600  
    3333        // phpcs:ignore WordPress.Security.NonceVerification.Recommended
    3434        if ( $pagenow === 'admin.php' && isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] ) ) === 'editx' ) {
    35             //Save admin menus
     35            //Save admin menus (original, before any editor modifications)
    3636            $this->save_admin_menus();
    3737
    3838            //Save admin columns
    3939            $this->save_admin_columns();
     40        }
     41
     42        // Apply admin menu editor if addon is active
     43        if ( editx()->is_active_addon( 'admin_menu_editor' ) ) {
     44            $this->admin_menu_editor();
    4045        }
    4146
     
    100105
    101106    /**
     107     * Extract a clean menu label from the raw WordPress menu label string.
     108     *
     109     * WordPress appends notification bubbles as HTML spans to some labels, e.g.:
     110     *   "Comments <span class="awaiting-mod"><span class="pending-count">5</span>..."
     111     * Stripping all tags naively concatenates the inner span text, producing
     112     * "Comments 5 Comments in moderation". Instead, we strip everything from the
     113     * first <span onwards so only the plain label text remains.
     114     *
     115     * @since 0.1.0
     116     *
     117     * @param string $raw_label Raw label HTML from $menu or $submenu.
     118     * @return string Clean, plain-text label.
     119     */
     120    protected function clean_menu_label( $raw_label ) {
     121        // Guard against null labels (e.g. separator menu items).
     122        $raw_label = (string) $raw_label;
     123
     124        // Strip from the first <span (notification bubbles) onwards.
     125        $before_span = preg_replace( '/<span[\s\S]*$/i', '', $raw_label );
     126        $clean       = trim( wp_strip_all_tags( (string) $before_span ) );
     127
     128        // Fallback: if nothing was left, strip all tags and remove stray digits.
     129        if ( '' === $clean ) {
     130            $clean = trim( preg_replace( '/\d+/', '', wp_strip_all_tags( $raw_label ) ) );
     131        }
     132
     133        return $clean;
     134    }
     135
     136    /**
    102137     * Save admin menus to option
    103138     *
     
    123158            $modify_menu_item = [];
    124159
    125             $clean_label = preg_replace( '/\d+/', '', wp_strip_all_tags( $menu_item[0] ) );
    126             $modify_menu_item['label'] = $clean_label;
     160            $modify_menu_item['label'] = $this->clean_menu_label( $menu_item[0] );
    127161            $modify_menu_item['capability'] = $menu_item[1];
    128162            $modify_menu_item['url'] = $menu_item[2];
     
    145179                foreach ( $submenu[ $menu_item[2] ] as $sub_item ) {
    146180                    $modify_sub_item = [];
    147                     $clean_label = preg_replace( '/\d+/', '', wp_strip_all_tags( $sub_item[0] ) );
    148                     $modify_sub_item['label'] = $clean_label;
     181                    $modify_sub_item['label'] = $this->clean_menu_label( $sub_item[0] );
    149182                    $modify_sub_item['capability'] = $sub_item[1];
    150183                    $modify_sub_item['url'] = $sub_item[2];
     
    201234        $custom_menu = get_option( 'editx_admin_menu_editor', [] );
    202235
     236        // Only apply if custom menu has been saved; avoid wiping menus on fresh install
     237        if ( empty( $custom_menu ) ) {
     238            return;
     239        }
     240
     241        // Index original menus by their URL/slug (index 2) before clearing
     242        $original_menu_by_url = [];
     243        foreach ( $menu as $item ) {
     244            $url = $item[2] ?? '';
     245            if ( $url ) {
     246                $original_menu_by_url[ $url ] = $item;
     247            }
     248        }
     249
     250        // Index original submenus by parent slug, then by sub-item URL
     251        $original_submenu_by_url = [];
     252        foreach ( $submenu as $parent => $sub_items ) {
     253            foreach ( $sub_items as $sub_item ) {
     254                $sub_url = $sub_item[2] ?? '';
     255                $original_submenu_by_url[ $parent ][ $sub_url ] = $sub_item;
     256            }
     257        }
     258
     259        // Save the EditX menu entry to restore after rebuild
     260        $editx_menu_entry     = $original_menu_by_url[ EDITX_SLUG ] ?? null;
     261        $editx_submenu_entries = $submenu[ EDITX_SLUG ] ?? [];
     262
    203263        // Remove all existing menus
    204264        // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     
    207267        $submenu = [];
    208268
    209         // Add custom menus
     269        // Rebuild menus using original entries in the custom order
     270        $position = 1;
    210271        foreach ( $custom_menu as $menu_item ) {
    211             if ( isset( $menu_item['classes'] ) && $menu_item['classes'] === 'wp-menu-separator' ) {
    212                 // Add separator
     272            // Skip hidden top-level menu items
     273            if ( ! empty( $menu_item['hidden'] ) ) {
     274                continue;
     275            }
     276
     277            $is_separator = (
     278                ( isset( $menu_item['classes'] ) && false !== strpos( $menu_item['classes'], 'wp-menu-separator' ) ) ||
     279                ( isset( $menu_item['url'] ) && 0 === strpos( (string) $menu_item['url'], 'separator' ) )
     280            );
     281
     282            if ( $is_separator ) {
     283                // Restore separator
    213284                // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
    214                 $menu[] = [ '', 'read', $menu_item['url'], '', 'wp-menu-separator' ];
     285                $menu[ $position ] = [ '', 'read', 'separator' . $position, '', 'wp-menu-separator' ];
    215286            } else {
    216                 // Add menu page
    217                 add_menu_page(
    218                     $menu_item['label'],
    219                     $menu_item['label'],
    220                     $menu_item['capability'],
    221                     $menu_item['url'],
    222                     '',
    223                     $menu_item['icon'],
    224                     null
    225                 );
    226 
    227                 // Add submenu items if any
    228                 if ( isset( $menu_item['submenu'] ) && is_array( $menu_item['submenu'] ) ) {
    229                     foreach ( $menu_item['submenu'] as $submenu_item ) {
    230                         add_submenu_page(
    231                             $menu_item['url'],
    232                             $submenu_item['label'],
    233                             $submenu_item['label'],
    234                             $submenu_item['capability'],
    235                             $submenu_item['url'],
    236                             ''
    237                         );
     287                $url = (string) ( $menu_item['url'] ?? '' );
     288                if ( isset( $original_menu_by_url[ $url ] ) ) {
     289                    // Restore original menu entry at new position (preserves URL, callbacks, hooks)
     290                    // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     291                    $menu[ $position ] = $original_menu_by_url[ $url ];
     292
     293                    // Apply custom label if set
     294                    if ( ! empty( $menu_item['label'] ) ) {
     295                        // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     296                        $menu[ $position ][0] = $menu_item['label'];
     297                    }
     298
     299                    // Apply custom icon if set
     300                    if ( ! empty( $menu_item['icon'] ) ) {
     301                        // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     302                        $menu[ $position ][6] = $menu_item['icon'];
     303                    }
     304
     305                    // Rebuild submenu in custom order if specified, skipping hidden subitems
     306                    if ( isset( $menu_item['submenu'] ) && is_array( $menu_item['submenu'] ) && isset( $original_submenu_by_url[ $url ] ) ) {
     307                        foreach ( $menu_item['submenu'] as $sub_item ) {
     308                            if ( ! empty( $sub_item['hidden'] ) ) {
     309                                continue; // Skip hidden subitems
     310                            }
     311                            $sub_url = (string) ( $sub_item['url'] ?? '' );
     312                            if ( isset( $original_submenu_by_url[ $url ][ $sub_url ] ) ) {
     313                                $restored_sub = $original_submenu_by_url[ $url ][ $sub_url ];
     314                                // Apply custom submenu label if set
     315                                if ( ! empty( $sub_item['label'] ) ) {
     316                                    $restored_sub[0] = $sub_item['label'];
     317                                }
     318                                // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     319                                $submenu[ $url ][] = $restored_sub;
     320                            }
     321                        }
     322                    } elseif ( isset( $original_submenu_by_url[ $url ] ) ) {
     323                        // No custom submenu order — keep original
     324                        // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     325                        $submenu[ $url ] = array_values( $original_submenu_by_url[ $url ] );
    238326                    }
    239327                }
    240328            }
     329            $position += 2;
     330        }
     331
     332        // Always restore the EditX menu so the plugin remains accessible in the sidebar
     333        if ( $editx_menu_entry ) {
     334            // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     335            $menu[ $position ] = $editx_menu_entry;
     336            if ( ! empty( $editx_submenu_entries ) ) {
     337                // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
     338                $submenu[ EDITX_SLUG ] = $editx_submenu_entries;
     339            }
    241340        }
    242341    }
     
    254353            $user_roles = $current_user->roles; // Get the roles of the current user
    255354
    256             $current_user_role = $user_roles[0];
     355            // User-specific restriction takes highest priority
    257356            $current_user_admin_menu = get_user_meta( $current_user->ID, '_editx_admin_menu', true );
    258             $current_role_admin_menu = get_option( 'editx_admin_menu_role_' . $current_user_role );
    259357            if ( $current_user_admin_menu ) {
    260358                $this->check_restrict_menu( $current_user_admin_menu );
    261             } elseif ( $current_role_admin_menu ) {
    262                 $this->check_restrict_menu( $current_role_admin_menu );
     359                return;
     360            }
     361
     362            // Fall back to role-based restriction; check all roles, use first match
     363            foreach ( $user_roles as $role ) {
     364                $current_role_admin_menu = get_option( 'editx_admin_menu_role_' . $role );
     365                if ( $current_role_admin_menu ) {
     366                    $this->check_restrict_menu( $current_role_admin_menu );
     367                    return;
     368                }
    263369            }
    264370        }
     
    276382            foreach ( $admin_menu as $menu ) {
    277383                if ( $menu['submenu'] ) {
    278                     foreach ( $menu['submenu'] as $submenu ) {
    279                         if ( array_key_exists( $menu['url'], $restrict_menu ) ) {
     384                    if ( ! array_key_exists( $menu['url'], $restrict_menu ) ) {
     385                        // Parent not allowed at all — remove parent once (not once per submenu)
     386                        $this->remove_admin_url_access( $menu['url'] );
     387                    } else {
     388                        // Parent allowed — check each submenu item individually
     389                        foreach ( $menu['submenu'] as $submenu ) {
    280390                            if ( ! in_array( $submenu['url'], $restrict_menu[ $menu['url'] ], true ) ) {
    281391                                $this->remove_admin_url_access( $menu['url'], $submenu['url'] );
    282392                            }
    283                         } else {
    284                             $this->remove_admin_url_access( $menu['url'] );
    285393                        }
    286394                    }
    287395                } elseif ( ! array_key_exists( $menu['url'], $restrict_menu ) ) {
    288                         $this->remove_admin_url_access( $menu['url'] );
     396                    $this->remove_admin_url_access( $menu['url'] );
    289397                }
    290398            }
     
    310418        if ( $url_to_hide === $pagenow || $url_to_hide === $parent_file ) {
    311419            do_action( 'editx_admin_page_access_denied' );
    312             wp_die( esc_html__( 'Sorry, you are not allowed to access this page.', 'editx' ), 403 );
     420            wp_die( esc_html__( 'Sorry, you are not allowed to access this page.', 'editx' ), '', [ 'response' => 403 ] );
    313421        }
    314422    }
  • editx/trunk/includes/Api/Types/AdminColumn.php

    r3478674 r3479600  
    3131
    3232        register_rest_route(
    33             $this->namespace, '/' . $this->base . '/(?P<id>[a-z0-9_]+)',
     33            $this->namespace, '/' . $this->base . '/(?P<id>[a-z0-9_-]+)',
    3434            [
    3535                'methods' => 'GET',
     
    4747
    4848        register_rest_route(
    49             $this->namespace, '/' . $this->base . '/(?P<id>[a-z0-9_]+)',
     49            $this->namespace, '/' . $this->base . '/(?P<id>[a-z0-9_-]+)',
    5050            [
    5151                'methods' => 'PUT',
     
    6363
    6464        register_rest_route(
    65             $this->namespace, '/' . $this->base . '/(?P<id>[a-z0-9,]+)',
     65            $this->namespace, '/' . $this->base . '/(?P<id>[a-z0-9_,-]+)',
    6666            [
    6767                'methods' => 'DELETE',
  • editx/trunk/includes/Api/Types/AdminMenu.php

    r3478674 r3479600  
    4646                'methods' => 'PUT',
    4747                'callback' => [ $this, 'update' ],
     48                'permission_callback' => [ $this, 'permission' ],
     49            ]
     50        );
     51
     52        register_rest_route(
     53            $this->namespace, '/' . $this->base . '/reset',
     54            [
     55                'methods' => 'DELETE',
     56                'callback' => [ $this, 'delete' ],
    4857                'permission_callback' => [ $this, 'permission' ],
    4958            ]
     
    97106
    98107    /**
     108     * Delete request — resets menu editor to default
     109     *
     110     * @since 0.1.0
     111     *
     112     * @return WP_REST_Response
     113     */
     114    public function delete() {
     115        delete_option( 'editx_admin_menu_editor' );
     116        return new \WP_REST_Response(
     117            [
     118                'success' => true,
     119                'data'    => null,
     120            ], 200
     121        );
     122    }
     123
     124    /**
    99125     * Update request
    100126     *
  • editx/trunk/includes/Assets/Manager.php

    r3478674 r3479600  
    101101    public function global_scripts(): array
    102102    {
    103         $dependency = require_once EDITX_DIR . '/assets/i18n-loader.asset.php';
     103        $dependency = require_once EDITX_DIR . '/build/i18n-loader.asset.php';
    104104
    105105        return [
     
    122122    public function get_scripts(): array
    123123    {
    124         $dependency = require_once EDITX_DIR . '/assets/index.asset.php';
     124        $dependency = require_once EDITX_DIR . '/build/index.asset.php';
    125125
    126126        return [
  • editx/trunk/includes/Hooks/Types/Filter/Types/AdminColumn.php

    r3478674 r3479600  
    7272
    7373            foreach ( $get_columns as $value ) {
    74                 $custom_column[ $value['id'] ] = $value['label'];
     74                if ( ! empty( $value['hidden'] ) ) {
     75                    continue; // Skip hidden columns
     76                }
     77                $custom_column[ (string) ( $value['id'] ?? '' ) ] = (string) ( $value['label'] ?? '' );
    7578            }
    7679
  • editx/trunk/languages/editx.pot

    r3478674 r3479600  
    22msgid ""
    33msgstr ""
    4 "Project-Id-Version: EditX 0.1.0\n"
     4"Project-Id-Version: EditX 0.1.1\n"
    55"Report-Msgid-Bugs-To: https://github.com/softtent/editx/issues\n"
    6 "Last-Translator: contact@softtent.com\n"
     6"Last-Translator: contact@nurency.com\n"
    77"Language-Team: LANGUAGE <LL@li.org>\n"
    88"MIME-Version: 1.0\n"
    99"Content-Type: text/plain; charset=UTF-8\n"
    1010"Content-Transfer-Encoding: 8bit\n"
    11 "POT-Creation-Date: 2026-03-10T01:31:49+00:00\n"
     11"POT-Creation-Date: 2026-03-10T13:11:36+00:00\n"
    1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1313"X-Generator: WP-CLI 2.11.0\n"
     
    1616#. Plugin Name of the plugin
    1717#: editx.php
    18 #: includes/Admin/Menu.php:60
    19 #: includes/Admin/Menu.php:61
     18#: includes/Admin/Menu.php:65
     19#: includes/Admin/Menu.php:66
    2020msgid "EditX"
    2121msgstr ""
     
    2828#. Description of the plugin
    2929#: editx.php
    30 msgid "A customization plugin for WordPress"
     30msgid "A admin menu editor, admin column editor, and admin access control plugin for WordPress"
    3131msgstr ""
    3232
     
    4545msgstr ""
    4646
    47 #: includes/Admin/Menu.php:74
     47#: includes/Admin/Menu.php:79
    4848#: includes/Api/Types/Addon.php:78
     49#: build/index.js:1
    4950msgid "Admin Menu Editor"
    5051msgstr ""
    5152
    52 #: includes/Admin/Menu.php:79
     53#: includes/Admin/Menu.php:84
    5354#: includes/Api/Types/Addon.php:84
     55#: build/index.js:1
    5456msgid "Admin Column Editor"
    5557msgstr ""
    5658
    57 #: includes/Admin/Menu.php:84
     59#: includes/Admin/Menu.php:89
    5860msgid "Manage Restrictions"
    5961msgstr ""
    6062
    61 #: includes/Admin/Menu.php:88
     63#: includes/Admin/Menu.php:93
     64#: build/index.js:1
    6265msgid "Addons"
    6366msgstr ""
    6467
    65 #: includes/Admin/Menu.php:312
     68#: includes/Admin/Menu.php:420
    6669msgid "Sorry, you are not allowed to access this page."
    6770msgstr ""
     
    8083
    8184#: includes/Api/Types/Addon.php:90
     85#: build/index.js:1
    8286msgid "Restriction"
    8387msgstr ""
     
    106110#: includes/Api/Types/Restriction.php:152
    107111#: includes/Api/Types/Restriction.php:401
     112#: build/index.js:1
    108113msgid "Please Select User"
    109114msgstr ""
     
    111116#: includes/Api/Types/Restriction.php:157
    112117#: includes/Api/Types/Restriction.php:406
     118#: build/index.js:1
    113119msgid "Please Select Role"
    114120msgstr ""
     
    179185#: includes/Models/AdminColumn.php:54
    180186#: includes/Models/AdminColumn.php:57
     187#: build/index.js:1
    181188msgid "Users"
    182189msgstr ""
     
    185192msgid "Loading..."
    186193msgstr ""
     194
     195#: build/index.js:1
     196msgid "Reorder, rename, hide or add custom items to the WordPress admin sidebar menu."
     197msgstr ""
     198
     199#: build/index.js:1
     200msgid "Customize, reorder and resize columns in WordPress list tables for any post type."
     201msgstr ""
     202
     203#: build/index.js:1
     204msgid "Menu Restrictions"
     205msgstr ""
     206
     207#: build/index.js:1
     208msgid "Control which admin menu items are visible to specific users or user roles."
     209msgstr ""
     210
     211#: build/index.js:1
     212msgid "Enable or disable EditX feature modules to match your workflow needs."
     213msgstr ""
     214
     215#: build/index.js:1
     216msgid "Edit"
     217msgstr ""
     218
     219#: build/index.js:1
     220msgid "Unhide"
     221msgstr ""
     222
     223#: build/index.js:1
     224msgid "Hide"
     225msgstr ""
     226
     227#: build/index.js:1
     228msgid "Add New Submenu"
     229msgstr ""
     230
     231#: build/index.js:1
     232msgid "separator"
     233msgstr ""
     234
     235#: build/index.js:1
     236msgid "hidden"
     237msgstr ""
     238
     239#: build/index.js:1
     240msgid "Add New Menu"
     241msgstr ""
     242
     243#: build/index.js:1
     244msgid "Edit Menu"
     245msgstr ""
     246
     247#: build/index.js:1
     248msgid "Save"
     249msgstr ""
     250
     251#: build/index.js:1
     252msgid "Apply"
     253msgstr ""
     254
     255#: build/index.js:1
     256msgid "Select"
     257msgstr ""
     258
     259#: build/index.js:1
     260msgid "Add New Column"
     261msgstr ""
     262
     263#: build/index.js:1
     264msgid "Edit Column"
     265msgstr ""
     266
     267#: build/index.js:1
     268msgid "Successfully Updated"
     269msgstr ""
     270
     271#: build/index.js:1
     272msgid "Columns reset to default"
     273msgstr ""
     274
     275#: build/index.js:1
     276msgid "Save Changes"
     277msgstr ""
     278
     279#: build/index.js:1
     280msgid "Reset to Default"
     281msgstr ""
     282
     283#: build/index.js:1
     284msgid "Screen"
     285msgstr ""
     286
     287#: build/index.js:1
     288msgid "View"
     289msgstr ""
     290
     291#: build/index.js:1
     292msgid "ID"
     293msgstr ""
     294
     295#: build/index.js:1
     296msgid "Name"
     297msgstr ""
     298
     299#: build/index.js:1
     300msgid "Email"
     301msgstr ""
     302
     303#: build/index.js:1
     304msgid "Label"
     305msgstr ""
     306
     307#: build/index.js:1
     308msgid "Actions"
     309msgstr ""
     310
     311#: build/index.js:1
     312msgid "Delete"
     313msgstr ""
     314
     315#: build/index.js:1
     316msgid "Successfully Added"
     317msgstr ""
     318
     319#: build/index.js:1
     320msgid "Restrict"
     321msgstr ""
     322
     323#: build/index.js:1
     324msgid "User"
     325msgstr ""
     326
     327#: build/index.js:1
     328msgid "Role"
     329msgstr ""
     330
     331#: build/index.js:1
     332msgid "Please Select Menu"
     333msgstr ""
     334
     335#: build/index.js:1
     336msgid "Updating…"
     337msgstr ""
     338
     339#: build/index.js:1
     340msgid "Submitting…"
     341msgstr ""
     342
     343#: build/index.js:1
     344msgid "Update"
     345msgstr ""
     346
     347#: build/index.js:1
     348msgid "Submit"
     349msgstr ""
     350
     351#: build/index.js:1
     352msgid "Back to"
     353msgstr ""
     354
     355#: build/index.js:1
     356msgid "Roles"
     357msgstr ""
     358
     359#: build/index.js:1
     360msgid "Menu Access"
     361msgstr ""
     362
     363#: build/index.js:1
     364msgid "Select the menu items you want to allow for this"
     365msgstr ""
     366
     367#: build/index.js:1
     368msgid "user"
     369msgstr ""
     370
     371#: build/index.js:1
     372msgid "role"
     373msgstr ""
     374
     375#: build/index.js:1
     376msgid "Active"
     377msgstr ""
     378
     379#: build/index.js:1
     380msgid "Inactive"
     381msgstr ""
     382
     383#: build/index.js:1
     384msgid "Page Not Found"
     385msgstr ""
     386
     387#: build/index.js:1
     388msgid "The page you are looking for does not exist."
     389msgstr ""
     390
     391#: build/index.js:1
     392msgid "Customize your WordPress admin experience — edit menus, columns and restrict access."
     393msgstr ""
     394
     395#: build/index.js:1
     396msgid "Menus reset to default"
     397msgstr ""
     398
     399#: build/index.js:1
     400msgid "Submenu Name"
     401msgstr ""
     402
     403#: build/index.js:1
     404msgid "Menu Name"
     405msgstr ""
     406
     407#: build/index.js:1
     408msgid "No restrictions yet"
     409msgstr ""
     410
     411#: build/index.js:1
     412msgid "No restrictions set for any"
     413msgstr ""
     414
     415#: build/index.js:1
     416msgid "yet."
     417msgstr ""
     418
     419#: build/index.js:1
     420msgid "Restrict a"
     421msgstr ""
Note: See TracChangeset for help on using the changeset viewer.