Как зарегистрировать register_post_types не нагружая memory size?

Ссылка скопирована
1 ответ

Всем привет! Регистрирую второй тип записей и сразу получаю ошибку, что не хватает памяти:

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 не нагружая memory size?

бесконечная рекурсия: внутри 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') ) ); }

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

Регистрация второго 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('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() на эту же функцию;
  • файл с кодом подключается сам из себя;
  • функция имеет одно имя, а в hook передано другое похожее имя;
  • код регистрации лежит внутри шаблона и выполняется много раз;
  • в labels или аргументы попал результат тяжёлого запроса;
  • используется неправильный hook, например регистрация CPT внутри 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 — это тяжёлая операция, которая может дополнительно тормозить сайт.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно