Как определить страницу добавления или редактирования записи/страницы/CPT в админке WordPress?

24 апр. 2012 г., 08:38:23
Просмотры: 27.6K
Голосов: 29

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

0
Все ответы на вопрос 4
4
40

Вот функция, которая у меня есть:

/**
 * 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
}
24 апр. 2012 г. 09:19:35
Комментарии

Спасибо. Также я нашел другую глобальную переменную $current_screen. global $current_screen;

if( $current_screen->post_type =='CPT' && $current_screen->action == 'add'){ //задача }

Dipesh KC Dipesh KC
24 апр. 2012 г. 11:05:47

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

kaiser kaiser
24 апр. 2012 г. 12:25:24

Спасибо за помощь

Muhammad Mabrouk Muhammad Mabrouk
6 окт. 2021 г. 08:01:19

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

Tyler Collier Tyler Collier
30 нояб. 2021 г. 22:30:19
0

Я предпочитаю использовать get_current_screen(), так как это гораздо проще:

$screen = get_current_screen();
  if ($screen->base == "post") {
}

Эта функция возвращает объект, который включает ID экрана, базовый тип, тип записи и таксономию, среди других данных.

(Кодекс)

20 дек. 2018 г. 21:12:11
0

Я хотел подключить скрипт и стили только на определенных экранах создания/редактирования типа записи. Создал функцию для проверки, нахожусь ли я на экране редактирования/создания записи заданного 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') ) {
    // выполнить действие
}
11 апр. 2019 г. 10:55:23
0

У меня есть эта функция

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 на других страницах...

8 сент. 2019 г. 15:58:39