Как узнать текущий тип записи при редактировании в post.php в админке?

4 июл. 2014 г., 15:46:47
Просмотры: 20.9K
Голосов: 17

Я пытаюсь выполнить определенное действие с помощью хука admin_init, если и только если пользователь редактирует запись (post.php) с типом записи "event". Моя проблема в том, что, хотя WordPress указывает на глобальную переменную $post_type, если я делаю:

global $post_type;
var_dump($post_type);

Возвращается NULL.

но если я делаю это:

global $pagenow;
var_dump($pagenow);

возвращается моя текущая страница, т.е. "post.php".

Я изучил функцию $screen = get_current_screen();, но она не объявляется до того, как выполнится хук admin_init, и тогда уже слишком поздно.

Итак, мой вопрос: как во время выполнения admin_init определить, какой тип записи редактируется в данный момент? Если URL имеет вид post.php?post=81&action=edit, как узнать, какой тип записи имеет post с id=81?

Спасибо Malthe

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

а что насчёт global $post?

Sisir Sisir
4 июл. 2014 г. 15:56:38

глобальная переменная post ещё не доступна в хуке admin_init

Malibur Malibur
4 июл. 2014 г. 16:15:04
Все ответы на вопрос 3
5
28
add_action( 'admin_init', 'do_something_152677' );
function do_something_152677 () {
    // Глобальный объект, содержащий текущую страницу админки
    global $pagenow;

    // Если текущая страница post.php и пост установлен, то запрашиваем его тип записи
    // если тип записи 'post', делаем что-то
    if ( 'post.php' === $pagenow && isset($_GET['post']) && 'post' === get_post_type( $_GET['post'] ) )
        // Делаем что-то
    }
}
4 июл. 2014 г. 16:15:11
Комментарии

При редактировании существующей записи URL имеет вид '/wp-admin/post.php?post=81&action=edit'

Malibur Malibur
4 июл. 2014 г. 16:24:32

Теперь исправлено... хотя для этого пришлось выполнить запрос к базе данных...

Alessandro Benoit Alessandro Benoit
4 июл. 2014 г. 16:55:40

Пожалуйста, добавьте объяснение того, что делает ваш код

Pieter Goosen Pieter Goosen
4 июл. 2014 г. 16:59:30

Очень полезный ответ, даже в 2018 году!

LoicTheAztec LoicTheAztec
23 апр. 2018 г. 21:08:32

Ответы только с кодом не очень полезны. Смотрите комментарий @PieterGoosen выше, написанный примерно 5 лет назад...

random_user_name random_user_name
27 мар. 2019 г. 20:06:32
0

get_current_screen()->post_type содержит слаг типа записи. Или можно использовать $_REQUEST['post_type']. Обратите внимание, что для стандартных страниц/записей post_type может быть не установлен.

16 янв. 2022 г. 22:35:43
1

Я расширю ответ MiCc83. В нем есть несколько моментов, которые не полностью соответствуют исходному вопросу автора, но в целом это отличное решение. Например, оно не будет работать с типом записи event, потому что в ответе проверяется тип записи 'post'.

add_action( 'admin_init', 'do_something_152677' );
function do_something_152677 () {
    // Глобальный объект, содержащий текущую страницу админки
    global $pagenow;

    // Если текущая страница post.php и пост установлен, то запрашиваем его тип записи
    if ( 'post.php' === $pagenow && isset($_GET['post']) ){
        $post_id = $_GET['post'];

        // Делаем что-то с $post_id. Например, можно получить полный объект записи:
        $post = get_post($post_id);

    }
}

Условие 'post' === get_post_type( $_GET['post'] ) в предыдущем ответе не позволит этому коду работать с типом записи 'event'. Вместо проверки на 'post' нужно проверять на 'event'.

26 мар. 2018 г. 04:42:59
Комментарии

Это полный и рабочий ответ.

Marty McGee Marty McGee
9 дек. 2020 г. 10:45:18