Php 提高自定义无限卷轴的速度
我有一个自定义的无限卷轴,它工作得很好,但它真的很慢。下面是处理ajax请求的脚本:-Php 提高自定义无限卷轴的速度,php,wordpress,optimization,woocommerce,Php,Wordpress,Optimization,Woocommerce,我有一个自定义的无限卷轴,它工作得很好,但它真的很慢。下面是处理ajax请求的脚本:- function ga_infinite_scroll() {//trigger this on infinite scroll add_filter( 'woocommerce_get_price_html', 'ga_show_price' );//filter to fix price range if(empty($_POST['search_term'] )){ $params =
function ga_infinite_scroll() {//trigger this on infinite scroll
add_filter( 'woocommerce_get_price_html', 'ga_show_price' );//filter to fix price range
if(empty($_POST['search_term'] )){
$params = json_decode( stripslashes( $_POST['query'] ), true );
$params['post_status'] = 'publish';
$params['posts_per_page'] = get_option('posts_per_page');
$params['post_type'] = 'product';
$params['paged'] = $_POST['page'] + 1; // we need next page to be loaded
}
else{//search logic here
$search_query = json_decode( stripslashes( $_POST['search_posts'] ), true );
$search_query['post_status'] = 'publish';
$search_query['posts_per_page'] = get_option('posts_per_page');
$search_query['paged'] = $_POST['page'] + 1;
wc_set_loop_prop( 'total', $_POST['search_count'] );
$params = $search_query;
}
ob_start();
query_posts( $params);
if ( have_posts() ) {//product loop
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
wc_get_template_part( 'content', 'product' );
}
}
}
$data = ob_get_clean();
die($data);
exit;
}
add_action( 'wp_ajax_ga_infinite_scroll', 'ga_infinite_scroll' );
add_action( 'wp_ajax_nopriv_ga_infinite_scroll', 'ga_infinite_scroll' );
下面是另一篇关于我对这个问题的简要描述。这是ga_show_price的代码
function ga_show_price( $price ) {
global $post, $product, $reg_price_field_slug, $sale_price_field_slug, $user_currency, $wp_query,$wp_object_cache;
if( count($product->get_children()) !== 0 ) {
$variations = $product->get_children();
$regularPriceList = [];
$salePriceList = [];
$lowestPrice;
$salePrice;
// die("here");
if( $product->is_on_sale() ) {
// NOTE: ADD caching HERE!!
if( false === get_transient( 'sales_price' ) ) {
foreach( $variations as $variation ) {
array_push($salePriceList, get_post_meta( $variation, $reg_price_field_slug, true ) );
}
set_transient( 'sales_price', $salePriceList, 12 * HOUR_IN_SECONDS );
}
else{
$salePriceList = get_transient( 'sales_price');
}
$salePrice = min($salePriceList);
$price = add_proper_decimal($salePrice);
return get_woocommerce_currency_symbol() . $price . ' ' . $user_currency;
} else {
// NOTE: ADD caching HERE!!
if( false === get_transient( 'reg_price' ) ) {
foreach( $variations as $variation ) {
array_push($regularPriceList, get_post_meta( $variation, $reg_price_field_slug, true ) );
}
set_transient( 'reg_price', $regularPriceList, 12 * HOUR_IN_SECONDS );
}
else{
$regularPriceList = get_transient( 'reg_price');
}
$lowestPrice = min($regularPriceList);
$price = add_proper_decimal($lowestPrice);
return get_woocommerce_currency_symbol() . $price . ' ' . $user_currency;
}
} else {
$price = get_post_meta( $post->ID, $reg_price_field_slug, true );
$price = add_proper_decimal($price); // pr( $price );
if ( $price == '0.00' ) {
return 'Call for Price';
}
return get_woocommerce_currency_symbol() . $price . ' ' . $user_currency;
}
}
我的javascript在这里:-
jQuery(document).ready( function($) {
var url = window.location.origin + '/wp-admin/admin-ajax.php',
canBeLoaded=true,
bottomOffset = 2000; // the distance (in px) from the page bottom when you want to load more posts
$(window).scroll(function(){
var data = {
'action': 'ga_infinite_scroll',
'query': my_ajax_object.posts,
'page' : my_ajax_object.current_page,
//'search_results' : my_ajax_object.ga_search_results,
'search_count' : my_ajax_object.ga_search_count,
'search_posts': my_ajax_object.ga_search_posts,
'search_term' : my_ajax_object.ga_search_term,
'user_currency': my_ajax_object.user_currency,
'reg_price_slug': my_ajax_object.reg_price_field_slug
};
if( $(document).scrollTop() > ( $(document).height() - bottomOffset ) && canBeLoaded == true ){
$.ajax({//limit the ajax calls
url : url,
data:data,
type:'POST',
beforeSend: function( xhr ){
// you can also add your own preloader here
// you see, the AJAX call is in process, we shouldn't run it again until complete
//console.log(data.search_term);
$('#ajax-loader').show();
canBeLoaded = false;
},
success:function(data){
if( data ) {
$('#multiple-products .columns-3 .products ').find('li:last-of-type').after( data ); // where to insert posts
//console.log(url);
canBeLoaded = true; // the ajax is completed, now we can run it again
my_ajax_object.current_page++;
$('#ajax-loader').hide();
}
else{
$('#ajax-loader').html('End of products...').delay(1000).fadeOut();
return;
}
}
});
}
});
//setting if it's a search
});
有没有一种方法可以在ajax请求处理脚本(ga_infinite_scroll)之外使用这个woocommerce_get_price_html过滤器,因为在ajax处理脚本中使用它的速度非常昂贵?我试着在ga_show_price()中使用瞬态。如何在这里实现其他类型的缓存以提高无限滚动的速度 因此,在这里使用瞬变可能是最好的“简单”答案,而无需进行重大返工。但是,您的
ga_show_price()
函数有几个问题
因此,您希望始终将从代码中调用的数据库调用或长函数的数量降至最低,以加快速度
sales\u price
的东西,那么一旦你对另一种产品使用了它,它仍然会保持前一种产品的价值。你可能要做的是为所有的瞬变过程生成一个唯一的名称。类似于:set\u transient('price.'$product->getSKU(),…)
$variations=$product->get_children()
-您正在加载产品所有子项的$variations
变量,这可能需要相当长的时间,并且涉及相当多的db调用,如果您已经有此产品的瞬态,则永远不会使用这些变体!。仅当您还没有产品的缓存值时才运行此行get\u transient
。一次检查它是否为false,然后再次实际检索该值。可能看起来是一件小事,但如果你有100多个产品在加载,它加起来 $value = get_transient('something');
if ($value === false)
{
$value = some_long_calculation();
set_transient('something', $value, ...);
}
//Now use $value here.
如果是这种情况,您可能最好考虑将每个产品的值缓存在自定义字段中?您可以附加挂钩,这样每次更新产品时,它都会自动更新计算价格自定义字段。因此,在这里使用瞬态可能是最好的“简单”答案,而无需进行重大返工。但是,您的
ga_show_price()
函数有几个问题
因此,您希望始终将从代码中调用的数据库调用或长函数的数量降至最低,以加快速度
sales\u price
的东西,那么一旦你对另一种产品使用了它,它仍然会保持前一种产品的价值。你可能要做的是为所有的瞬变过程生成一个唯一的名称。类似于:set\u transient('price.'$product->getSKU(),…)
$variations=$product->get_children()
-您正在加载产品所有子项的$variations
变量,这可能需要相当长的时间,并且涉及相当多的db调用,如果您已经有此产品的瞬态,则永远不会使用这些变体!。仅当您还没有产品的缓存值时才运行此行get\u transient
。一次检查它是否为false,然后再次实际检索该值。可能看起来是一件小事,但如果你有100多个产品在加载,它加起来 $value = get_transient('something');
if ($value === false)
{
$value = some_long_calculation();
set_transient('something', $value, ...);
}
//Now use $value here.
如果是这种情况,您可能最好考虑将每个产品的值缓存在自定义字段中?您可以附加挂钩,这样每次更新产品时,它都会自动更新计算出的价格自定义字段。@Mikepote对ga_price的建议提高了速度,但基于独特的瞬时速度,编辑主产品循环会更快。我在此附上我的代码:-
if( empty(get_transient('ga_loop_products_'.md5(serialize($params))))){ //using md5 and serialize(for 32digit) to assign a unique name to the given set of params
query_posts( $params);
ob_start();
add_filter( 'woocommerce_get_price_html', 'ga_show_price' );//filter to fix price range
if ( have_posts() ) {//product loop
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
wc_get_template_part( 'content', 'product' );
}
}
}
$data = ob_get_clean();
// $ga_loop = get_transient('ga_loop_products_'.md5(serialize($params)));
set_transient( 'ga_loop_products_'.md5(serialize($params)), $data, 24 * 60 ); // 1 day cache
}
else{
$data= get_transient('ga_loop_products_'.md5(serialize($params)));
}
wp_reset_query();
@Mikepote对ga_price的建议提高了速度,但基于独特的瞬时速度编辑主产品回路更能提高速度。我在此附上我的代码:-
if( empty(get_transient('ga_loop_products_'.md5(serialize($params))))){ //using md5 and serialize(for 32digit) to assign a unique name to the given set of params
query_posts( $params);
ob_start();
add_filter( 'woocommerce_get_price_html', 'ga_show_price' );//filter to fix price range
if ( have_posts() ) {//product loop
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
wc_get_template_part( 'content', 'product' );
}
}
}
$data = ob_get_clean();
// $ga_loop = get_transient('ga_loop_products_'.md5(serialize($params)));
set_transient( 'ga_loop_products_'.md5(serialize($params)), $data, 24 * 60 ); // 1 day cache
}
else{
$data= get_transient('ga_loop_products_'.md5(serialize($params)));
}
wp_reset_query();
在ga_show_价格函数中添加了变化产品价格的瞬态,并更新了上面的代码在ga_show_价格函数中添加了变化产品价格的瞬态,并更新了上面的代码非常感谢您的回复。我一定会按照你的建议去做,并随时通知你。同样作为一个测试,我尝试在主循环中应用transient来存储$data=ob_get_clean();,卷轴非常快,但由于瞬变是全球性的,所以有相同的产品在重复。我想知道如何在调用主循环时生成唯一的瞬态,然后打印$数据。有什么见解吗