Как зарегистрировать register_post_types не нагружая memory size?
Всем привет! Регистрирую второй тип записей и сразу получаю ошибку, что не хватает памяти:
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 20480 bytes) |
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 20480 bytes)
Явно, что тут, что-то не так. Изначально второй тип записей добавил, как отдельную функцию registered_post_type_(post_type), потом добавил второй тип записей в основную функцию registered_post_type, где находится первый тип записей. И все равно получаю ошибку, что не хватает памяти. Что я делаю не так ?
Я пробовал добавить в конфиг
define( 'WP_MEMORY_LIMIT', '512M' );
И пробовал добавить в php.ini
memory_limit = 512M
Но все равно получаю ошибку. Мой код в function.php выглядит так:
add_action( 'init', 'register_post_types' ); function register_post_types(){ register_post_type( 'job-list', [ 'label' => null, 'labels' => [ 'name' => 'Вакансии', // основное название для типа записи 'singular_name' => 'Добавить вакансию', // название для одной записи этого типа 'add_new' => 'Добавить вакансию', // для добавления новой записи 'add_new_item' => 'Добавление вакансии', // заголовка у вновь создаваемой записи в админ-панели. 'edit_item' => 'Редактирование вакансии', // для редактирования типа записи 'new_item' => 'Новое ____', // текст новой записи 'view_item' => 'Смотреть вакансию', // для просмотра записи этого типа. 'search_items' => 'Искать вакансию', // для поиска по этим типам записи 'not_found' => 'Вакансий не найдено', // если в результате поиска ничего не было найдено 'not_found_in_trash' => 'Вакансий не найдено в корзине', // если не было найдено в корзине 'parent_item_colon' => '', // для родителей (у древовидных типов) 'menu_name' => 'Вакансии', // название меню ], 'description' => 'Вакансии Эскела Job', 'public' => true, 'publicly_queryable' => true, // зависит от public 'exclude_from_search' => true, // зависит от public 'show_ui' => true, // зависит от public 'show_in_nav_menus' => true, // зависит от public 'show_in_menu' => true, // показывать ли в меню админки 'show_in_admin_bar' => true, // зависит от show_in_menu 'show_in_rest' => true, // добавить в REST API. C WP 4.7 'rest_base' => null, // $post_type. C WP 4.7 'menu_position' => 3, 'menu_icon' => get_template_directory_uri() .'/images/favicon/eskela.png', //'capability_type' => 'post', //'capabilities' => 'post', // массив дополнительных прав для этого типа записи //'map_meta_cap' => null, // Ставим true чтобы включить дефолтный обработчик специальных прав 'hierarchical' => false, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'author' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => [], 'has_archive' => false, 'rewrite' => true, 'query_var' => true, ] ); register_post_types( 'reviews-post', [ 'label' => null, 'labels' => [ 'name' => 'Отзывы', // основное название для типа записи 'singular_name' => 'Отзыв', // название для одной записи этого типа 'add_new' => 'Добавить отзыв', // для добавления новой записи 'add_new_item' => 'Добавление отзыва', // заголовка у вновь создаваемой записи в админ-панели. 'edit_item' => 'Редактирование отзыва', // для редактирования типа записи 'new_item' => 'Новый отзыв', // текст новой записи 'view_item' => 'Смотреть отзыв', // для просмотра записи этого типа. 'search_items' => 'Искать отзывы', // для поиска по этим типам записи 'not_found' => 'Не найдено отзывов', // если в результате поиска ничего не было найдено 'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине 'parent_item_colon' => '', // для родителей (у древовидных типов) 'menu_name' => 'Отзывы', // название меню ], 'description' => 'Блок отзывов Eskela Job', 'public' => true, 'publicly_queryable' => true, // зависит от public 'exclude_from_search' => true, // зависит от public 'show_ui' => true, // зависит от public 'show_in_nav_menus' => true, // зависит от public 'show_in_menu' => true, // показывать ли в меню админки 'show_in_admin_bar' => true, // зависит от show_in_menu 'show_in_rest' => true, // добавить в REST API. C WP 4.7 'rest_base' => null, // $post_type. C WP 4.7 'menu_position' => 3, 'menu_icon' => get_template_directory_uri() .'/images/favicon/eskela.png', //'capability_type' => 'post', //'capabilities' => 'post', // массив дополнительных прав для этого типа записи //'map_meta_cap' => null, // Ставим true чтобы включить дефолтный обработчик специальных прав 'hierarchical' => false, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'author' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => [], 'has_archive' => false, 'rewrite' => true, 'query_var' => true, ] ); } |
add_action( 'init', 'register_post_types' ); function register_post_types(){ register_post_type( 'job-list', [ 'label' => null, 'labels' => [ 'name' => 'Вакансии', // основное название для типа записи 'singular_name' => 'Добавить вакансию', // название для одной записи этого типа 'add_new' => 'Добавить вакансию', // для добавления новой записи 'add_new_item' => 'Добавление вакансии', // заголовка у вновь создаваемой записи в админ-панели. 'edit_item' => 'Редактирование вакансии', // для редактирования типа записи 'new_item' => 'Новое ____', // текст новой записи 'view_item' => 'Смотреть вакансию', // для просмотра записи этого типа. 'search_items' => 'Искать вакансию', // для поиска по этим типам записи 'not_found' => 'Вакансий не найдено', // если в результате поиска ничего не было найдено 'not_found_in_trash' => 'Вакансий не найдено в корзине', // если не было найдено в корзине 'parent_item_colon' => '', // для родителей (у древовидных типов) 'menu_name' => 'Вакансии', // название меню ], 'description' => 'Вакансии Эскела Job', 'public' => true, 'publicly_queryable' => true, // зависит от public 'exclude_from_search' => true, // зависит от public 'show_ui' => true, // зависит от public 'show_in_nav_menus' => true, // зависит от public 'show_in_menu' => true, // показывать ли в меню админки 'show_in_admin_bar' => true, // зависит от show_in_menu 'show_in_rest' => true, // добавить в REST API. C WP 4.7 'rest_base' => null, // $post_type. C WP 4.7 'menu_position' => 3, 'menu_icon' => get_template_directory_uri() .'/images/favicon/eskela.png', //'capability_type' => 'post', //'capabilities' => 'post', // массив дополнительных прав для этого типа записи //'map_meta_cap' => null, // Ставим true чтобы включить дефолтный обработчик специальных прав 'hierarchical' => false, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'author' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => [], 'has_archive' => false, 'rewrite' => true, 'query_var' => true, ] ); register_post_types( 'reviews-post', [ 'label' => null, 'labels' => [ 'name' => 'Отзывы', // основное название для типа записи 'singular_name' => 'Отзыв', // название для одной записи этого типа 'add_new' => 'Добавить отзыв', // для добавления новой записи 'add_new_item' => 'Добавление отзыва', // заголовка у вновь создаваемой записи в админ-панели. 'edit_item' => 'Редактирование отзыва', // для редактирования типа записи 'new_item' => 'Новый отзыв', // текст новой записи 'view_item' => 'Смотреть отзыв', // для просмотра записи этого типа. 'search_items' => 'Искать отзывы', // для поиска по этим типам записи 'not_found' => 'Не найдено отзывов', // если в результате поиска ничего не было найдено 'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине 'parent_item_colon' => '', // для родителей (у древовидных типов) 'menu_name' => 'Отзывы', // название меню ], 'description' => 'Блок отзывов Eskela Job', 'public' => true, 'publicly_queryable' => true, // зависит от public 'exclude_from_search' => true, // зависит от public 'show_ui' => true, // зависит от public 'show_in_nav_menus' => true, // зависит от public 'show_in_menu' => true, // показывать ли в меню админки 'show_in_admin_bar' => true, // зависит от show_in_menu 'show_in_rest' => true, // добавить в REST API. C WP 4.7 'rest_base' => null, // $post_type. C WP 4.7 'menu_position' => 3, 'menu_icon' => get_template_directory_uri() .'/images/favicon/eskela.png', //'capability_type' => 'post', //'capabilities' => 'post', // массив дополнительных прав для этого типа записи //'map_meta_cap' => null, // Ставим true чтобы включить дефолтный обработчик специальных прав 'hierarchical' => false, 'supports' => [ 'title', 'editor', 'thumbnail', 'custom-fields', 'author' ], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats' 'taxonomies' => [], 'has_archive' => false, 'rewrite' => true, 'query_var' => true, ] ); }
Дополнительно:
Я пробовал добавить в конфиг define( 'WP_MEMORY_LIMIT', '512M' );
А смысл?
Allowed memory size of 1073741824 bytes exhausted
У вас уже гигабайт потрачен, а вы лимит на полгига ставить пытаетесь..
бесконечная рекурсия: внутри register_post_types() безусловно вызывается register_post_types()
вторая регистрация типа поста должна быть register_post_type() без s
- Супер! Я не знал :( Спасибо большое!
Ответы:
Получилось. Взял пример на WP -Kama с книгами:
add_action('init', 'my_custom_init'); function my_custom_init(){ register_post_type('book', array( 'labels' => array( 'name' => 'Книги', // Основное название типа записи 'singular_name' => 'Книга', // отдельное название записи типа Book 'add_new' => 'Добавить новую', 'add_new_item' => 'Добавить новую книгу', 'edit_item' => 'Редактировать книгу', 'new_item' => 'Новая книга', 'view_item' => 'Посмотреть книгу', 'search_items' => 'Найти книгу', 'not_found' => 'Книг не найдено', 'not_found_in_trash' => 'В корзине книг не найдено', 'parent_item_colon' => '', 'menu_name' => 'Книги' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','author','thumbnail','excerpt','comments') ) ); } |
add_action('init', 'my_custom_init'); function my_custom_init(){ register_post_type('book', array( 'labels' => array( 'name' => 'Книги', // Основное название типа записи 'singular_name' => 'Книга', // отдельное название записи типа Book 'add_new' => 'Добавить новую', 'add_new_item' => 'Добавить новую книгу', 'edit_item' => 'Редактировать книгу', 'new_item' => 'Новая книга', 'view_item' => 'Посмотреть книгу', 'search_items' => 'Найти книгу', 'not_found' => 'Книг не найдено', 'not_found_in_trash' => 'В корзине книг не найдено', 'parent_item_colon' => '', 'menu_name' => 'Книги' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','author','thumbnail','excerpt','comments') ) ); }
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Регистрация второго
register_post_type()сама по себе не должна съедать 1 GB памяти. Такая ошибка почти всегда означает рекурсию, неправильный hook или то, что функция регистрации вызывает сама себя/подключает файл по кругу.Типовая схема регистрации CPT должна быть такой:
add_action('init', 'register_books_post_type'); function register_books_post_type() { register_post_type('book', [ 'labels' => [ 'name' => 'Книги', 'singular_name' => 'Книга', ], 'public' => true, 'has_archive' => true, 'show_in_rest' => true, 'supports' => ['title', 'editor', 'thumbnail'], 'rewrite' => ['slug' => 'books'], ]); }
Ошибки, которые часто приводят к проблемам:
add_action()на эту же функцию;labelsили аргументы попал результат тяжёлого запроса;wpилиtemplate_redirect.Проверьте, что второй CPT не называется так же, как существующий post type, taxonomy, page slug или rewrite endpoint. Название post type должно быть латиницей, без пробелов, лучше короткое:
book,case,service.Если Вы скопировали первую функцию и переименовали только часть имён, проверьте все места: имя функции, post type key, labels, rewrite slug, taxonomy registration. Очень часто остаётся старое имя функции и получается конфликт.
Для диагностики временно оставьте минимальный код регистрации без taxonomies, meta boxes, REST controllers и дополнительных функций. Если минимальный CPT работает, возвращайте остальную логику по одному блоку. Так быстро найдёте, что именно вызывает рост памяти.
После изменения rewrite один раз пересохраните постоянные ссылки в админке. Но не ставьте
flush_rewrite_rules()прямо вinit— это тяжёлая операция, которая может дополнительно тормозить сайт.