I have written code to get certain tags, and then show the products that have those tags.
This is the code:
$tag_string = '';
for ($i = 0; $i < 8; $i++) {
for ($j = 0; $j < 8; $j++) {
$tag_to_use = get_post_meta($post->ID, '_tag_to_use_'.$i.'_'.$j, true);
$tag_string = $tag_to_use ? $tag_string .= $tag_to_use . ',' : $tag_string .= '';
}
}
if ( substr( $tag_string, -1) == ',' ) {
$tag_string = rtrim( $tag_string, ',' );
}
echo do_shortcode( '[products tag="' . $tag_string . '"]' );
}
When I run th code, I get slow page loads.
When I change this:
echo do_shortcode( '[products tag="' . $tag_string . '"]' );
To this:
echo do_shortcode( '[products tag="test,test1"]' );
The page loads fast.
Why is that happening, and how can I fix it? If any more information is needed, tell me and I'll update the question.
Thanks!
I have written code to get certain tags, and then show the products that have those tags.
This is the code:
$tag_string = '';
for ($i = 0; $i < 8; $i++) {
for ($j = 0; $j < 8; $j++) {
$tag_to_use = get_post_meta($post->ID, '_tag_to_use_'.$i.'_'.$j, true);
$tag_string = $tag_to_use ? $tag_string .= $tag_to_use . ',' : $tag_string .= '';
}
}
if ( substr( $tag_string, -1) == ',' ) {
$tag_string = rtrim( $tag_string, ',' );
}
echo do_shortcode( '[products tag="' . $tag_string . '"]' );
}
When I run th code, I get slow page loads.
When I change this:
echo do_shortcode( '[products tag="' . $tag_string . '"]' );
To this:
echo do_shortcode( '[products tag="test,test1"]' );
The page loads fast.
Why is that happening, and how can I fix it? If any more information is needed, tell me and I'll update the question.
Thanks!
Share Improve this question edited Mar 20, 2019 at 18:26 SherylHohman 8419 silver badges14 bronze badges asked Mar 19, 2019 at 7:33 OmerOmer 1491 gold badge4 silver badges14 bronze badges 6 | Show 1 more comment1 Answer
Reset to default 1I'm not sure, if it is the root of the problem, but the thing that I noticed is that your code ends up calling get_post_meta
quite many times (64? 8 loops within 8 loops, yes?) for the same post.
Perhaps you could get all of the post meta just once, before the for loop. Then within your loop use isset()
or ! empty()
to check if the data exists.
Something along these lines,
$post_meta = get_post_meta($post->ID); // This returns an array with all the data in position 0, if I remember correctly
for ($i = 0; $i < 8; $i++) {
for ($j = 0; $j < 8; $j++) {
if ( isset( $post_meta[0]['_tag_to_use_'.$i.'_'.$j] ) ) {
$tag_to_use = $post_meta[0]['_tag_to_use_'.$i.'_'.$j];
// The meta value might be in a array with the position 0, var_dump $tag_to_use to see if this is the case
// $tag_to_use = $post_meta[0]['_tag_to_use_'.$i.'_'.$j][0];
$tag_string = $tag_to_use ? $tag_string .= $tag_to_use . ',' : $tag_string .= '';
}
}
}
Use var_dump
to check that you get the array indexes correct and maybe_unserialize()
the meta data, if needed.
I don't know if this is just broscience and wishful thinking, but maybe it's worth the try. You can of course use microtime
to get a rough idea, if the loop above is faster than the original.
var_dump( $tag_string );
? And instead of callingdo_shortcode()
, you could just directly call the function which handles theproducts
shortcode. – Sally CJ Commented Mar 19, 2019 at 7:40var_dump( $tag_string );
-string(22) "test,test1,test2,Aztec"
. What is the function it calls? – Omer Commented Mar 19, 2019 at 7:45echo do_shortcode( '[products tag="test,test1,test2,Aztec"]' )
? – Sally CJ Commented Mar 19, 2019 at 7:52[products limit="8" paginate="true" tag="' . $tag_string . '"]
and now it loads fine. Do you know how I could change it to infinte scroll instead of pagination? – Omer Commented Mar 19, 2019 at 7:56