web-dev-qa-db-ja.com

Adminでpost.phpを実行したときに現在の投稿の種類を知る方法

ユーザーが投稿タイプ "event"で投稿(post.php)を編集している場合に限り、admin_initフックで何かをしようとしています。私の問題は、たとえ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という投稿タイプを知るにはどうすればいいですか?

ありがとうMalthe

9
Malibur
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
    }
}
18
MiCc83

私はMiCc83の答えを詳しく説明します。 OPの元々の質問に従わないことがいくつかありますが、全体的にそれは素晴らしい解決策です。例えば、あなたは答えの中でpost_typeを 'post'としてチェックしているのでpost_typeイベントではうまくいきません。

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'] )は、投稿タイプ 'event'に対してこれが機能するのを妨げるでしょう。 'post'の代わりに 'event'という投稿タイプを確認する必要があります。

0
MxmastaMills