Skąd mam wiedzieć, jaki jest obecny typ posta na post.php w adminie?

11

Próbuję zrobić coś z hakiem admin_init, jeśli - i tylko jeśli - użytkownik edytuje post (post.php) z wpisem typu „event”. Mój problem polega na tym, że chociaż wordpress wskazuje na zmienną globalną o nazwie $ post_type. Jeśli zrobię:

global $post_type;
var_dump($post_type);

Zwraca NULL.

ale jeśli to zrobię:

global $pagenow;
var_dump($pagenow);

zwraca moją bieżącą stronę. tzn. „post.php”.

$screen = get_current_screen();Zajrzałem do tej funkcji, ale ta deklarowana jest dopiero po uruchomieniu hooków admin_init, a potem do późna.

Więc moje pytanie brzmi: jak mogę, zanim admin_init zostanie uruchomiony, dowiedzieć się, jaki typ posta jest aktualnie edytowany. jeśli jest post.php?post=81&action=editto adres URL , skąd mam wiedzieć, jaki jest typ posta postid = 81?

Dzięki Malthe

Malibur
źródło
co global $post?
Sisir
globalny post nie jest jeszcze dostępny w haczyku
admin_init

Odpowiedzi:

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
źródło
Podczas edytowania istniejącego wpisu adres URL to „/wp-admin/post.php?post=81&action=edit”
Malibur
W porządku teraz naprawione ... mimo że musisz zapytać db, aby to zrobić ...
MiCc83
1
Dodaj wyjaśnienie do tego, co robi Twój kod
Pieter Goosen
Bardzo pomocna odpowiedź nawet w 2018 roku!
LoicTheAztec
Tylko odpowiedzi na kod nie są zbyt przydatne. Zobacz komentarz @PieterGoosen powyżej, sprzed około 5 lat ....
random_user_name
0

Mam zamiar rozwinąć odpowiedź MiCc83. Jest kilka rzeczy, które nie odpowiadają oryginalnym pytaniom OP, ale ogólnie jest to świetne rozwiązanie. Na przykład nie działałoby ze zdarzeniem post_type, ponieważ sprawdzasz typ post_type jako „post” w odpowiedzi.

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);

    }
}

Warunek 'post' === get_post_type( $_GET['post'] )z poprzedniej odpowiedzi uniemożliwiłby temu działanie w przypadku „zdarzenia” typu postu. Konieczne będzie sprawdzenie typu „zdarzenie” typu „post” zamiast „post”.

MxmastaMills
źródło