как узнать, находится ли администратор на странице редактирования страницы или записи

7 дек. 2013 г., 19:17:51
Просмотры: 54.9K
Голосов: 28

Я использую это после того, как проверил, является ли пользователь администратором

   if ( isset($_GET['action'])  && $_GET['action'] === 'edit' )

есть ли способ лучше?

2
Комментарии

По результатам моих сегодняшних тестов, это кажется лучшим способом сделать это с текущими условными тегами WP, потому что get_current_screen, согласно документации, может завершаться фатальной ошибкой на некоторых экранах админки. Подробнее см. в документации: https://codex.wordpress.org/Function_Reference/get_current_screen

Nathan Nathan
25 мар. 2016 г. 20:44:13

но попытка вызвать get_current_screen() приведёт к фатальной ошибке, потому что функция не определена. — тогда может обернуть в if (function_exists('get_current_screen'))?

Frank N Frank N
1 янв. 2017 г. 10:11:31
Все ответы на вопрос 3
5
31

Вы можете использовать функцию get_current_screen для определения текущего экрана.

$screen = get_current_screen();
if ( $screen->parent_base == 'edit' ) {
    echo 'это экран редактирования';
}

Не могу точно сказать, что этот способ всегда лучше — всё зависит от конкретной задачи, но лично я предпочитаю использовать именно его. Главное преимущество этого метода в том, что вы получаете доступ к большему количеству информации и, следовательно, можете делать более тонкие и разнообразные проверки. Просто взгляните на документацию, чтобы понять, о чём я говорю.

Эту функцию следует использовать в более поздних хуках, как указано в Кодексе:

Функция возвращает null, если вызывается в хуке admin_init. Её можно безопасно использовать в более поздних хуках, например current_screen.

7 дек. 2013 г. 19:41:06
Комментарии

Это будет верно и для списка записей и страниц, верно? Например, mywebsite.com/wp-admin/edit.php?post_status=draft&post_type=post

Nathan Nathan
25 мар. 2016 г. 20:42:01

@Nathan Верно, это так. Как сказано в ответе, правильный подход зависит от конкретного случая использования. Это определенно не лучший способ для всех ситуаций, но в некоторых случаях он хорош или даже оптимален.

Nicolai Grossherr Nicolai Grossherr
26 мар. 2016 г. 15:38:06

Примечание: Прямой вызов get_current_screen() во многих случаях может вызвать критическую ошибку. Обязательно оберните его в функцию и вызывайте через соответствующий хук.

squarecandy squarecandy
13 янв. 2017 г. 18:53:34

Условие $screen->is_block_editor == 1 сработало для меня, чтобы проверить страницу редактирования. parent_base оказался пустым.

Floris Floris
21 сент. 2021 г. 14:25:36

parent_base у меня всегда NULL как в списке записей, так и при редактировании отдельной записи. Вместо этого я использовал if (get_current_screen()->base === 'post' && get_current_screen()->post_type === 'my_post_type'). Это для админ-страницы редактирования отдельной записи. Для экрана edit.php (админ-страницы со списком записей) используйте edit вместо post.

Denis P Denis P
6 авг. 2024 г. 18:27:17
6
27

редактирование: читайте комментарии для возможных недочетов.


Вы можете использовать глобальную переменную $pagenow

global $pagenow;
if ($pagenow == 'post.php' && get_post_type() == 'post') {

    // редактирование записи блога

}
if ($pagenow == 'profile.php') {

    // редактирование страницы профиля пользователя

}
10 июл. 2017 г. 11:39:55
Комментарии

Я обнаружил, что это работает, за исключением $_GET['post_type']. Однако вместо этого мне помог get_post_type().

Ashe Abbott DiBlasi Ashe Abbott DiBlasi
14 сент. 2017 г. 19:30:18

$_GET['post_type'] устанавливается только на странице post-new.php при создании новой записи, но не на post.php, где происходит редактирование записи. get_post_type() будет работать для post.php, потому что запись уже существует и имеет тип записи, но я не уверен, что он сработает на post-new.php. Ответ Frank'а лучше, так как он работает в обоих случаях.

Jacob Peattie Jacob Peattie
10 апр. 2018 г. 10:31:35

В первом условии, почему используется OR ( || ), а не AND ( && )?

alexg alexg
8 июн. 2021 г. 12:25:23

спасибо за помощь. это лучший ответ в некоторых ситуациях.

Abilash Erikson Abilash Erikson
5 нояб. 2021 г. 13:07:10

нет, как насчёт post-new.php? названия новых страниц меняются в каждой мажорной версии, это ненадёжно.

scavenger scavenger
29 апр. 2024 г. 04:46:18

Это не работает. Когда вы выходите из редактирования блока и возвращаетесь обратно, блок перерисовывается неправильно. Это работает только при первой загрузке.

Shane McCurdy Shane McCurdy
22 мая 2024 г. 18:52:19
Показать остальные 1 комментариев
1
  • Используйте 'get_current_screen', но предварительно убедитесь, что функция существует.
  • Как говорится в кодексе "Эта функция определена на большинстве страниц админки, но не на всех."
  • Кстати, это также отфильтровывает обычные (видимые пользователям) страницы (перечитайте это предложение, с акцентом на админ-страницы).
  • Скорее всего, следующее, что вам нужно выяснить - находитесь ли вы на странице или записи...

    // Удаление ненужных метабоксов записей
    function FRANK_TWEAKS_current_screen() {
        // "Эта функция определена на большинстве страниц админки, но не на всех."
        if ( function_exists('get_current_screen')) {  
    
            $pt = get_current_screen()->post_type;
            if ( $pt != 'post' && $pt != 'page') return;
    
            remove_meta_box( 'authordiv',$pt ,'normal' );        // Метабокс автора
            remove_meta_box( 'commentstatusdiv',$pt ,'normal' ); // Метабокс статуса комментариев
            remove_meta_box( 'commentsdiv',$pt ,'normal' );      // Метабокс комментариев
            remove_meta_box( 'postcustom',$pt ,'normal' );       // Метабокс произвольных полей
            remove_meta_box( 'postexcerpt',$pt ,'normal' );      // Метабокс цитаты
            remove_meta_box( 'revisionsdiv',$pt ,'normal' );     // Метабокс ревизий
            remove_meta_box( 'slugdiv',$pt ,'normal' );          // Метабокс слага
            remove_meta_box( 'trackbacksdiv',$pt ,'normal' );    // Метабокс трекбэков
        }
    }
    add_action( 'current_screen', 'FRANK_TWEAKS_current_screen' );
    
1 янв. 2017 г. 12:48:54
Комментарии

спасибо за информацию, get_current_screen() — это правильный инструмент для использования, так как он предоставляет много полезных данных.

Sagive Sagive
9 нояб. 2017 г. 10:13:21