Как определить страницу добавления или редактирования записи/страницы/CPT в админке WordPress?
Это кажется простым, но мне нужен способ определить, находимся ли мы на экране Добавить новую или Редактировать (что-то вроде условного тега WordPress админки). Существует ли уже встроенная функция для этого, или... есть идеи как это реализовать?

Вот функция, которая у меня есть:
/**
* is_edit_page
* функция для проверки, является ли текущая страница страницей редактирования записи
*
* @author Ohad Raz <admin@bainternet.info>
*
* @param string $new_edit какую страницу проверять, принимает new - страница создания записи, edit - страница редактирования записи, null - любая из них
* @return boolean
*/
function is_edit_page($new_edit = null){
global $pagenow;
//убедимся, что мы в админке
if (!is_admin()) return false;
if($new_edit == "edit")
return in_array( $pagenow, array( 'post.php', ) );
elseif($new_edit == "new") //проверяем страницу создания записи
return in_array( $pagenow, array( 'post-new.php' ) );
else //проверяем любую из страниц - редактирования или создания
return in_array( $pagenow, array( 'post.php', 'post-new.php' ) );
}
Использование Использование простое, как и любых других условных тегов, несколько примеров:
проверить страницу создания или редактирования:
if (is_edit_page()){
//да, это страница редактирования/создания записи
}
проверить страницу создания записи:
if (is_edit_page('new')){
//да, это страница создания записи
}
проверить страницу редактирования записи:
if (is_edit_page('edit')){
//да, это страница редактирования существующей записи
}
можно комбинировать с глобальной переменной $typenow
для проверки страницы редактирования определенного типа записи:
global $typenow;
if (is_edit_page('edit') && "Post_Type_Name" == $typenow){
//да, это страница редактирования пользовательского типа записи с именем Post_Type_Name
}

Спасибо. Также я нашел другую глобальную переменную $current_screen. global $current_screen;
if( $current_screen->post_type =='CPT' && $current_screen->action == 'add'){ //задача }

+1 Думал, что единственное условие для админки это is_admin
;). Есть еще?

Продолжая комментарий DipeshKC, хук current_screen
полезен, когда значение current_screen
становится доступным.

Я предпочитаю использовать get_current_screen()
, так как это гораздо проще:
$screen = get_current_screen();
if ($screen->base == "post") {
}
Эта функция возвращает объект, который включает ID экрана, базовый тип, тип записи и таксономию, среди других данных.
(Кодекс)

Я хотел подключить скрипт
и стили
только на определенных экранах создания/редактирования
типа записи. Создал функцию для проверки, нахожусь ли я на экране редактирования/создания
записи заданного CPT
.
/**
* Проверяет, открыт ли экран редактирования или создания записи
* для указанного типа записи
*
* @param null $post_type название типа записи для сравнения
*
* @return bool true или false
*/
function is_edit_or_new_cpt( $post_type = null ) {
global $pagenow;
/**
* Возвращает false, если не в админке или
* тип записи для сравнения не указан
*/
if ( ! is_admin() || $post_type === null ) {
return FALSE;
}
/**
* Если активен экран редактирования типа записи
*/
if ( $pagenow === 'post.php' ) {
// получаем ID записи, в случае просмотра всех записей CPT ID будет -1
$post_id = isset( $_GET[ 'post' ] ) ? $_GET[ 'post' ] : - 1;
// если нет ID записи, возвращаем false
if ( $post_id === - 1 ) {
return FALSE;
}
// получаем тип записи по ID
$get_post_type = get_post_type( $post_id );
// если тип записи совпадает, возвращаем true, иначе false
if ( $post_type === $get_post_type ) {
return TRUE;
} else {
return FALSE;
}
} elseif ( $pagenow === 'post-new.php' ) { // если активен экран создания новой записи
// получаем тип записи из массива $_GET
$get_post_type = isset( $_GET[ 'post_type' ] ) ? $_GET[ 'post_type' ] : '';
// если тип записи совпадает, возвращаем true, иначе false
if ( $post_type === $get_post_type ) {
return TRUE;
} else {
return FALSE;
}
} else {
// возвращаем false для всех остальных страниц
return FALSE;
}
}
Чтобы использовать функцию, передайте название типа записи.
/**
* Возвращает true, если открыт экран редактирования или создания записи для 'cpt_name'
*/
if ( is_edit_or_new_cpt('cpt_name') ) {
// выполнить действие
}

У меня есть эта функция
if(!function_exists('is_post_edit_page')){
function is_post_edit_page() {
static $result = null;
if ( $result === null ) {
$result = false;
if ( is_admin() ) {
if (
empty( $_POST )
&&
isset( $_GET['action'] )
&&
$_GET['action'] === 'edit'
&&
isset( $_GET['post'] )
) {
// Страница редактирования записи
$result = true;
} elseif (
isset( $_POST['action'] )
&&
$_POST['action'] === 'editpost'
&&
isset( $_POST['post_type'] )
&&
isset( $_POST['post_ID'] )
&&
strpos( wp_get_referer(), 'action=edit' ) !== false
) {
// Отправка формы редактирования записи
$result = true;
}
}
}
return $result;
}
}
которая возвращает true на странице редактирования и false на других страницах...
