Мы используем плагин JSON API, в котором мы сталкиваемся с проблемой производительности приложения. Для запуска приложения требуется 10-20 секунд времени загрузки.
Мы протестировали запрос Api и получили результат, так как некоторые медленные SQL-запросы получают вызов, как указано ниже. Этот запрос происходит из запроса JSON API.
Мы не можем определить, откуда этот SQL-запрос запускается, поскольку путь, упомянутый в запросе, мы внесли некоторые изменения в post_type, например, мы исключили post1 И post2 из query.php, но без изменений мы получаем тот же результат в медленном режиме. SQL запрос в базе данных.
SELECT iqoyau1_posts.ID
FROM iqoyau1_posts
INNER JOIN iqoyau1_postmeta ON ( iqoyau1_posts.ID = iqoyau1_postmeta.post_id )
WHERE 1=1
AND (
( iqoyau1_postmeta.meta_key = '_hide-in-ipad'
AND CAST(iqoyau1_postmeta.meta_value AS CHAR) = '1'
)
)
AND iqoyau1_posts.post_type IN ('post1', 'post2', 'post3', 'post4',
'post5)
AND ((iqoyau1_posts.post_status = 'publish'))
GROUP BY iqoyau1_posts.ID
ORDER BY iqoyau1_posts.post_date DESC /* in [/plugins/ipad-app/query.php:38]
Вот наш код query.php:
<?php
function pre_get_posts( $wp_query ){
$json = $wp_query->get( 'json' );
if( !$json )
return $wp_query;
$api_version = $wp_query->get( 'api_ver' );
if( version_compare($api_version, '2.0', '<') ){
$wp_query->query_vars['post_type'] =array( 'ipad-post' );
$wp_query->query_vars['posts_per_page'] = 36;
}
elseif( version_compare($api_version, '2.0', '>=') ){
$url = $_SERVER['REQUEST_URI'];
if ($_GET["post_type"]== "XXX" && strpos($url,'api_v2') ){
$wp_query->query_vars['post_type'] = 'XXX';
$wp_query->query_vars['posts_per_page'] = $_GET["count"];
}else{
$wp_query->query_vars['post_type'] = array( 'post3', 'post4','post5);
$wp_query->query_vars['posts_per_page'] = $_GET["count"];
}
// exclude posts set to not show in ipad app
$not_in = new \WP_Query( array(
'fields' => 'ids',
'meta_key' => '_hide-in-ipad',
'meta_value' => 1,
'posts_per_page' => -1
) );
$wp_query->query_vars['post__not_in'] =
array_merge( $not_in->posts, $wp_query->get('post__not_in') );
}
$wp_query->query_vars['ignore_sticky_posts'] = TRUE;
return $wp_query;
}
add_filter( 'pre_get_posts', __NAMESPACE__.'\pre_get_posts' );
/*
* allow post__not_in in query string with normal or json syntax
* @param array
* @return array
*/
function request( $qv ){
if( !empty($qv['api_ver'])
&& version_compare($qv['api_ver'], '2.0', '>=')
&& !empty($_GET['post__not_in']) ){
if( is_string($_GET['post__not_in']) )
$qv['post__not_in'] = (array) json_decode( $_GET['post__not_in'] );
elseif( is_array($_GET['post__not_in']) )
$qv['post__not_in'] = $_GET['post__not_in'];
$qv['post__not_in'] = array_map( 'intval', $qv['post__not_in'] );
}
return $qv;
}
add_filter( 'request', __NAMESPACE__.'\request' );
Мы также оптимизировали вложения и теги из ответа json, производительность немного улучшилась, как и раньше, но мы все еще сталкиваемся с проблемой производительности из-за медленного запроса к базе данных.
Как мы можем оптимизировать запрос Любая Помощь.
Избавиться от id
в postmeta
и измените PK на PRIMARY KEY(post_id, meta_key)
,
Видеть GROUP BY
могут быть удалены без изменения выхода.
При чем тут JSON?
Других решений пока нет …