Определите, редактирую ли я страницу или пост в Wordpress - PullRequest
0 голосов
/ 03 ноября 2010

Я унаследовал плагин Wordpress, который делает настраиваемые поля доступными при редактировании страниц и / или сообщений. Он добавляет немного другой контент для страниц, чем для постов. Плагин определяет страницу или сообщение со следующим:

if(preg_match('|post.php|i', $_SERVER['SCRIPT_NAME']) || preg_match('|post-new.php|i', $_SERVER['SCRIPT_NAME'])) {
        add_meta_box('qaws_' . $cg ,$group, 'qaws_admin_meta', 'post', 'advanced', 'core');
    } elseif(preg_match('|page.php|i', $_SERVER['SCRIPT_NAME']) || preg_match('|page-new.php|i', $_SERVER['SCRIPT_NAME'])) {
        add_meta_box('qaws_' . $cg ,$group, 'qaws_admin_meta', 'page', 'advanced', 'core');
    }

Это работало нормально в старых версиях Wordpress, потому что они использовали post.php в URL при редактировании posts и page.php при редактировании страниц. Теперь, однако, Wordpress не делает этого. Сообщения и страницы редактируются с помощью URL-адреса, который выглядит следующим образом: post.php?post=4&action=edit, поэтому единственным возможным идентификатором в URL-адресе является номер сообщения.

Итак, как мне определить, редактирую ли я страницу или сообщение? Есть ли функция Wordpress, которая может легко сказать мне это? Это единственный вариант, чтобы получить номер поста и как-то проверить его, чтобы увидеть, что это такое?

Как бы вы подошли к этому?


EDIT: Вот что я сделал ... вместо того, чтобы делать preg_match, я получил глобальный $ id, использовал get_all_page_ids(), чтобы получить список всех страниц, и сопоставил $ id с идентификаторами в массиве get_all. Если есть совпадение, сделайте страницу add_meta_box, если не сделайте пост один.

Я также перенес извлечение из цикла, в котором он сохранял кучу времени для рендеринга страницы. Теперь я установил флаг прямо в начале, и в цикле рендеринг этих meta_boxes просто проверяется, установлен ли этот флаг.

Ответы [ 6 ]

11 голосов
/ 01 апреля 2013

Начиная с WP 3.1 , вы можете использовать get_current_screen(), чтобы получить полную информацию о текущем экране, отображаемом на бэкэнде: http://codex.wordpress.org/Function_Reference/get_current_screen

3 голосов
/ 03 ноября 2010

Доступна ли функция is_page () для вашего плагина?

См. Здесь: http://codex.wordpress.org/Conditional_Tags

2 голосов
/ 04 ноября 2010

Было бы лучше использовать get_post_type ($ id)

http://codex.wordpress.org/Function_Reference/get_post_type

1 голос
/ 13 января 2015

в файле /wp-admin/includes/screen.php, строка 530 @see set_current_screen ()

global $typenow
$typenow = $this->post_type;

Вот что я использую:

if ($typenow == 'post') {
//do something for post screens only.
}

или

if ($typenow == 'page') {
//do something for page screens only.
}
0 голосов
/ 27 февраля 2014

вы можете попробовать использовать функцию get_current_screen (), чтобы проверить, редактируете ли вы с поста или страницы, вам просто нужно установить условие

$screen = get_current_screen();
if($screen->post_type == 'page'){
 //do something for page screens only
}elseif($screen->post_type == 'post'){
//do something for post screens only.
}

Дайте мне знать, работает ли оно для вас.

0 голосов
/ 23 октября 2012

Вот что я использую:

if( strstr($_SERVER['REQUEST_URI'], 'wp-admin/post-new.php') || strstr($_SERVER['REQUEST_URI'], 'wp-admin/post.php') ) {
    //I'm editing a post, page or custom post type
}else{
    //I'm doing none of the above.
}

Удачи!

...