Здравствуйте, бьюсь с проблемой долгой загрузки сайта на WP, узкое место - в цикле (~1500 итераций) выполняется функция register_taxonomy - создает объект класса PHP.
Можно ли кам-то образом закэшировать этот момент? Т.е. результат выполнения функции или полностью цикл?
Пробовал, статически страницы сохранять - не выход, объектное кэширование не помогло, + пробовал использовать Memcached, но он такие данные не сохраняет? Вот так сама функция выглядит:
spoiler
function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
/* br added */
// $cache_key = 'br_cache_tax_' . md5($taxonomy);
// wp_cache_delete( $cache_key );
// $cache = wp_cache_get( $cache_key );
// if( false !== $cache )
// return $cache;
/* ./ br added */
global $wp_taxonomies;
if ( ! is_array( $wp_taxonomies ) ) {
$wp_taxonomies = array();
}
$args = wp_parse_args( $args );
if ( empty( $taxonomy ) || strlen( $taxonomy ) > 32 ) {
_doing_it_wrong( __FUNCTION__, __( 'Taxonomy names must be between 1 and 32 characters in length.' ), '4.2.0' );
return new WP_Error( 'taxonomy_length_invalid', __( 'Taxonomy names must be between 1 and 32 characters in length.' ) );
}
$taxonomy_object = new WP_Taxonomy( $taxonomy, $object_type, $args );
$taxonomy_object->add_rewrite_rules();
$wp_taxonomies[ $taxonomy ] = $taxonomy_object;
$taxonomy_object->add_hooks();
// Add default term.
if ( ! empty( $taxonomy_object->default_term ) ) {
$term = term_exists( $taxonomy_object->default_term['name'], $taxonomy );
if ( $term ) {
update_option( 'default_term_' . $taxonomy_object->name, $term['term_id'] );
} else {
$term = wp_insert_term(
$taxonomy_object->default_term['name'],
$taxonomy,
array(
'slug' => sanitize_title( $taxonomy_object->default_term['slug'] ),
'description' => $taxonomy_object->default_term['description'],
)
);
// Update `term_id` in options.
if ( ! is_wp_error( $term ) ) {
update_option( 'default_term_' . $taxonomy_object->name, $term['term_id'] );
}
}
}
/**
* Fires after a taxonomy is registered.
*
* @since 3.3.0
*
* @param string $taxonomy Taxonomy slug.
* @param array|string $object_type Object type or array of object types.
* @param array $args Array of taxonomy registration arguments.
*/
do_action( 'registered_taxonomy', $taxonomy, $object_type, (array) $taxonomy_object );
/* br added */
//wp_cache_set( $cache_key, $taxonomy_object ); // добавим данные в кэш
/* ./ br added */
return $taxonomy_object;
}
Артем Золин, Знаю, что это не гуд) Но пока другого решения не вижу. Столкнулся с проблемой в Woocommerce - глобальные атрибуты создаются отдельными таксономиями и затем на каждой страницы сайта (на хуке init) происходит их регистрация в цикле (у меня их больше 1000) и загрузка сайта замедляется на ~3 секунды. Woo разводят руками - говорят это в wp так устроено... Удалить атрибуты не могу - нужны для фильтров интернет магазина, может у вас есть мысли по этому поводу?)
Bodrosh, у меня есть идея не заходить вообще в админку) Выполняйте все команды через wp-cli, REST API или нативными функциями wp_insert_post(), add_post_meta(), wc_get_product(), set_regular_price() и т.д.
Bodrosh, что-то я не уверен, что во фронтенеде происходит регистрация таксономий. Поставьте квери монитор, наверняка он просто покажет тяжелые запросы. Кешируйте фронтенд в статичный html, вряд ли вы с этим что-то сделаете