最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

shortcode - Slow page Loads When Using Dynamic Coding

matteradmin7PV0评论

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
  • What is the output of var_dump( $tag_string ); ? And instead of calling do_shortcode(), you could just directly call the function which handles the products shortcode. – Sally CJ Commented Mar 19, 2019 at 7:40
  • This is the output of var_dump( $tag_string ); - string(22) "test,test1,test2,Aztec" . What is the function it calls? – Omer Commented Mar 19, 2019 at 7:45
  • And is it still slow with echo do_shortcode( '[products tag="test,test1,test2,Aztec"]' ) ? – Sally CJ Commented Mar 19, 2019 at 7:52
  • Yes. I have changed the shortcode to this: [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
  • It's not that I don't know, but try searching for an existing question/answer/solution - or a plugin like this.. – Sally CJ Commented Mar 19, 2019 at 8:12
 |  Show 1 more comment

1 Answer 1

Reset to default 1

I'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.

Post a comment

comment list (0)

  1. No comments so far