2010-11-03 2 views
0

Я унаследовал плагин Wordpress, который позволяет создавать пользовательские поля при редактировании страниц и/или сообщений. Он добавляет немного другой контент для страниц, чем для сообщений. Плагин определяет страницу или сообщение со следующим:Определить, редактирую ли я страницу или сообщение в 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 при редактировании сообщения и page.php при редактировании страниц. Теперь, однако, Wordpress этого не делает. Оба сообщения и страницы редактируются с URL-адресом, который выглядит так: post.php?post=4&action=edit, поэтому единственным возможным идентификатором в URL-адресе является номер сообщения.

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

Как вы подходите к этому?


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

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

ответ

2

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

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

+0

Спасибо за ответ. Это хороший ответ! Единственная проблема с этим заключается в том, что я создаю новую страницу или сообщение, тогда у меня нет идентификатора страницы или сообщения для проверки. Тем не менее, я уже обрабатываю это с помощью: preg_match ('| post_type = page | i', $ _SERVER ['QUERY_STRING']), поэтому я могу использовать функцию, которую вы предлагаете, с этим предварительным совпадением и по-прежнему хорошо идти. Благодаря! – Lothar

3

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

Смотрите здесь: http://codex.wordpress.org/Conditional_Tags

+0

Не в области редактирования администратора. 'is_page()' работает только тогда, когда отображается сама страница. Я показываю только область редактирования и загружаю в нее данные этой страницы. – Lothar

+0

Я верю, что is_page доступно в стороне администратора, но требует аргумент '$ page'' is_page (post_id_from_url) '. Просто возьмите идентификатор из URL. – Gavin

+0

Я добавил свое решение к вопросу, если вам интересно. – Lothar

0

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

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. 
} 

Удачи!

1

вы можете попробовать использовать функцию 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. 
} 

Сообщите мне, если это сработает для вас.

1

в файле/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. 
}