Как я могу узнать текущий тип сообщения, когда он находится на post.php в админке?

11

Я пытаюсь сделать что-то с хуком admin_init, если - и только если - пользователь редактирует пост (post.php) с типом поста "событие". Моя проблема в том, что, хотя 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тогда, как я могу узнать, что тип поста postid = 81?

Спасибо мальте

Malibur
источник
о чем global $post?
Сисир
глобальный пост еще не доступен в хуке admin_init
Малибур

Ответы:

21
add_action( 'admin_init', 'do_something_152677' );
function do_something_152677 () {
    // Global object containing current admin page
    global $pagenow;

    // If current page is post.php and post isset than query for its post type 
    // if the post type is 'event' do something
    if ( 'post.php' === $pagenow && isset($_GET['post']) && 'post' === get_post_type( $_GET['post'] ) )
        // Do something
    }
}
MiCc83
источник
При редактировании существующей записи URL-адрес '/wp-admin/post.php?post=81&action=edit'
Малибур
Все исправлено сейчас ... даже если вам нужно запросить БД, чтобы сделать это ...
MiCc83
1
Пожалуйста, добавьте объяснение, что делает ваш код
Питер Гусен
Очень полезный ответ даже в 2018 году!
LoicTheAztec
Код только ответы не очень полезны. См. Комментарий @PieterGoosen выше, ~ 5 лет назад ....
random_user_name
0

Я собираюсь расширить ответ MiCc83. Есть несколько вещей, которые не следуют первоначальным вопросам ОП, но в целом это отличное решение. Например, он не будет работать с событием post_type, потому что вы проверяете post_type как «post» в ответе.

add_action( 'admin_init', 'do_something_152677' );
function do_something_152677 () {
    // Global object containing current admin page
    global $pagenow;

    // If current page is post.php and post isset than query for its post type 
    if ( 'post.php' === $pagenow && isset($_GET['post']) ){
        $post_id = $_GET['post'];

        // Do something with $post_id. For example, you can get the full post object:
        $post = get_post($post_id);

    }
}

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

MxmastaMills
источник