Mostrar y paginar solo las categorías infantiles con la consulta de WordPress -- performance campo con php campo con wordpress camp codereview Relacionados El problema

Show and paginate only child categories with wordpress query


2
vote

problema

Español

Estoy usando esta pieza de código para mostrar y paginar solo las categorías infantiles, pero esto es horriblemente lento ( 9988776655544334 ).

¿Dónde cometí errores y cómo puedo hacer que esta ejecute más rápido?

  <?php  $current_cat = get_query_var('cat'); $attributes = array('terms_per_page' => 20, 'taxonomy' => 'category');  // Sanitize and validate our inputs and set variables $tpp = filter_var( $attributes['terms_per_page'], FILTER_VALIDATE_INT ); $taxonomy = filter_var( $attributes['taxonomy'], FILTER_SANITIZE_STRING );  // Make sure our taxonomy exists to avoid unnecessary work if ( !taxonomy_exists( $taxonomy ) ) return false;  // Our taxonomy exists, lets continue // Get the term count to calculate pagination. $term_count = count( get_terms('category',array('hide_empty'=>'1','child_of' => $current_cat) ) );  // We have terms, now calculate pagination $max_num_pages = ceil( $term_count / $tpp ); // Get current page number. Take static front pages into account as well if ( get_query_var('paged')){ $paged = get_query_var('paged'); } elseif ( get_query_var('page')) { $paged = get_query_var( 'page' ); } else { $paged = 1; } // Calculate term offset $offset = ( ( $paged - 1 ) * $tpp );  // We can now get our terms and paginate it $args = array( 'number'     => $tpp, // Amount of terms to return 'offset'     => $offset, // The amount to offset the list by for pagination 'child_of'   => $current_cat, 'orderby'    => 'name',  'order'      => 'ASC',  'hide_empty' => '1', ); // Set our variable to hold our string $output = ''; $wpbtags = get_terms( $taxonomy, $args );  if ( ! empty($wpbtags)) { foreach ($wpbtags as $category) {   //first get the current category ID $cat_prefix = "category_"; $cat_id = $category->term_id; //then i get the data from the database $join_cat = $cat_prefix . $cat_id; $cat_data = get_option($join_cat);?>  <a href="<?php echo get_category_link($category->term_id); ?>"     onclick="ga('send', 'event', 'ClickNav', 'cats', 'Cat - <?php echo $category-    >cat_name; ?>');"> <div class="one_fourth<?php echo ( ++$counter == 4 )?' last_column':''; ?> home-colour" title="<?php echo $category->name; ?>">  <?php if (!empty($cat_data['cat_img_url'])) : ?> <h2 style="text-align:center"> <?php echo $category->name; ?> </h2> <img class="res_img" src="<?php echo $cat_data['cat_img_url'] ;?>" alt="<?php echo $category->cat_name; ?>" width="310" height="209" />  <?php elseif (empty($cat_data['cat_img_url'])) :?> <h2 style="text-align:center"> <?php echo $category->name; ?> </h2> <img class="res_img" src="<?php echo get_stylesheet_directory_uri(); ?>/images/subcat-img-na.png" alt="Posts - <?php echo $category->cat_name; ?>"/>  <?php else : ?> <?php endif; ?> </div><!-- eof cat div --> </a>  <?php } ?>     <?php /* COUNTS FOUR ADDS LAST COLUMN */ if ( $counter == 4 ) : ?> <div class='clear'> </div> <?php $counter = 0; endif; wp_reset_query(); ?>  <div class='clear'> </div>  <?php echo '<div class="wp-pagenavi" style="text-align:center">'; $big = 999999999; // need an unlikely integer echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $max_num_pages = (ceil( $term_count / $tpp)) ) );  echo '</div>'; ?>     <?php wp_reset_postdata(); ?>  <?php  /* IF THERE'S NOTHING TO SHOW */ } else {?>  // Show something if there is no posts here  <?php } ?>   
Original en ingles

I'm using this piece of code to show and paginate only child categories but this is horribly slow (49 queries in 9,799 seconds.).

Where did I make mistakes and how can I make this run faster?

<?php  $current_cat = get_query_var('cat'); $attributes = array('terms_per_page' => 20, 'taxonomy' => 'category');  // Sanitize and validate our inputs and set variables $tpp = filter_var( $attributes['terms_per_page'], FILTER_VALIDATE_INT ); $taxonomy = filter_var( $attributes['taxonomy'], FILTER_SANITIZE_STRING );  // Make sure our taxonomy exists to avoid unnecessary work if ( !taxonomy_exists( $taxonomy ) ) return false;  // Our taxonomy exists, lets continue // Get the term count to calculate pagination. $term_count = count( get_terms('category',array('hide_empty'=>'1','child_of' => $current_cat) ) );  // We have terms, now calculate pagination $max_num_pages = ceil( $term_count / $tpp ); // Get current page number. Take static front pages into account as well if ( get_query_var('paged')){ $paged = get_query_var('paged'); } elseif ( get_query_var('page')) { $paged = get_query_var( 'page' ); } else { $paged = 1; } // Calculate term offset $offset = ( ( $paged - 1 ) * $tpp );  // We can now get our terms and paginate it $args = array( 'number'     => $tpp, // Amount of terms to return 'offset'     => $offset, // The amount to offset the list by for pagination 'child_of'   => $current_cat, 'orderby'    => 'name',  'order'      => 'ASC',  'hide_empty' => '1', ); // Set our variable to hold our string $output = ''; $wpbtags = get_terms( $taxonomy, $args );  if ( ! empty($wpbtags)) { foreach ($wpbtags as $category) {   //first get the current category ID $cat_prefix = "category_"; $cat_id = $category->term_id; //then i get the data from the database $join_cat = $cat_prefix . $cat_id; $cat_data = get_option($join_cat);?>  <a href="<?php echo get_category_link($category->term_id); ?>"     onclick="ga('send', 'event', 'ClickNav', 'cats', 'Cat - <?php echo $category-    >cat_name; ?>');"> <div class="one_fourth<?php echo ( ++$counter == 4 )?' last_column':''; ?> home-colour" title="<?php echo $category->name; ?>">  <?php if (!empty($cat_data['cat_img_url'])) : ?> <h2 style="text-align:center"> <?php echo $category->name; ?> </h2> <img class="res_img" src="<?php echo $cat_data['cat_img_url'] ;?>" alt="<?php echo $category->cat_name; ?>" width="310" height="209" />  <?php elseif (empty($cat_data['cat_img_url'])) :?> <h2 style="text-align:center"> <?php echo $category->name; ?> </h2> <img class="res_img" src="<?php echo get_stylesheet_directory_uri(); ?>/images/subcat-img-na.png" alt="Posts - <?php echo $category->cat_name; ?>"/>  <?php else : ?> <?php endif; ?> </div><!-- eof cat div --> </a>  <?php } ?>     <?php /* COUNTS FOUR ADDS LAST COLUMN */ if ( $counter == 4 ) : ?> <div class='clear'> </div> <?php $counter = 0; endif; wp_reset_query(); ?>  <div class='clear'> </div>  <?php echo '<div class="wp-pagenavi" style="text-align:center">'; $big = 999999999; // need an unlikely integer echo paginate_links( array( 'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ), 'format' => '?paged=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $max_num_pages = (ceil( $term_count / $tpp)) ) );  echo '</div>'; ?>     <?php wp_reset_postdata(); ?>  <?php  /* IF THERE'S NOTHING TO SHOW */ } else {?>  // Show something if there is no posts here  <?php } ?> 
        
     
     

Lista de respuestas

1
 
vote

El problema real aquí es que está consultando en bucles (casi siempre un patrón malo) porque confía en las funciones de consulta de WordPress incorporadas, en lugar de escribir SQL crudo para consultar todos estos datos a la vez.

Mi conjetura es que puede hacer una sola consulta para obtener los resultados paginados y el número total de filas sin que se apliquen el límite (mediante el uso de str_replace()4 ).

Puede considerar abrir específicamente la pregunta de STACHOVERFLOW sobre los problemas de consulta múltiple / lenta junto con la información en las tablas de su base de datos relevantes para estas consultas para obtener una sugerencia sobre cómo escribir una consulta apropiada.


Fuera de eso, encuentro su código increíblemente difícil de leer, y, mientras que algunos de los que pueden tener que ver con las siguientes convenciones de estilo en WordPress (que realmente mala OMI), deberían al menos sangrar código y colocar comentarios correctamente ( es decir, no prependente comentario en líneas de código).

 

The real problem here is that you are querying in loops (almost always a bad pattern) because you are relying on built-in Wordpress querying functions, rather than writing raw SQL to query all this data at once.

My guess is you can do a single query to get both the paginated results and the total number of rows without limit being applied (by using SQL_CALC_FOUND_ROWS).

You might consider opening StackOverflow question specifically about the multiple/slow query problems along with information on your database tables relevant to these queries to get a suggestion on how to write an appropriate query.


Outside of that, I find your code incredibly difficult to read, and while some of that might have to do with following style conventions in Wordpress (which really bad IMO), you should at least indent you code and place comments properly (i.e. not prepending comment on code lines).

 
 

Relacionados problema

3  Cree un sitio de sitio de WordPress con los datos de la aplicación NGINX automáticamente  ( Create a wordpress site data with nginx app data automatically ) 
El siguiente script está dirigido a Ubuntu >=16.04 LEMP entornos con PHP-FPM 9988777665544335 , MySQL, WP-CLI, CertBot y WordPress Apps. El script Obteng...

2  Visualización de campos en una barra lateral de una plantilla de página personalizada  ( Displaying fields in a sidebar of a custom page template ) 
Estoy comenzando con la programación de PHP y apreciaría una crítica en mi código y cómo podría hacerlo más eficiente, en lugar de repetir las declaraciones ...

1  Script de cuatro líneas para hacer una copia de seguridad inmediata de DB y Document Root  ( Four lines script to make an immediate db and document root zip backup ) 
¿Qué piensas de mi script para hacer una copia de seguridad inmediata de DB y DOCUMENTE ROOT ROOT? Cualquier falla que puedas encontrar. Por favor, infórmeme ...

4  Añadir campos de perfil de usuario  ( Add user profile fields ) 
Tengo esta función PHP que agrega campos de perfil de usuario personalizados a WordPress. Guarda el campo a través del archivo WOOCOMMERCE FORM-EDIT-MY-CUENTA...

6  Determinar el valor en el rango, inyectar a HTML que se utilizará en CSS  ( Determine value in range inject to html to be used in css ) 
Quiero mostrar a los usuarios qué paquete están, según cuántos artículos tienen en su carrito. El código funciona, pero me pregunto si algo puede mejorarse. ...

1  Botón para seguir / dejar de seguir un usuario  ( Button to follow unfollow a user ) 
Como principiante en la codificación, acabo de escribir este código. El código debe agregar un formulario con un botón a cada perfil de usuario, llamado Sig...

1  Conversión CSV a MySQL con PHP en mi complemento de WordPress personalizado  ( Converting csv to mysql with php in my custom wordpress plugin ) 
Tengo una función que convierte un archivo de CSV a MYSQL El archivo podría ser de 5,000 filas de largo hasta 90,000 filas de largo. Sobre la base de qu...

5  Mostrando todas las publicaciones individuales  ( Displaying all single posts ) 
Creo que hay algunos problemas de sangría confusa y extraños en este archivo de WordPress (single.php). ¿Alguna sugerencia sobre la mejora de la sangría y la ...

3  Exportación de datos en un widget de WordPress  ( Exporting data in a wordpress widget ) 
Tengo algunas tablas personalizadas en una base de datos de WordPress que necesito para exportar a CSV. Creé un widget de Dashboard para ayudarlo con esto en ...

6  ¿Modificar los bucles personalizados para mejorar la legibilidad y la eficiencia para WordPress?  ( Modify custom loops to improve readability and efficiency for wordpress ) 
El siguiente código recupere los tipos de publicaciones personalizadas con su taxonomía personalizada. Solo soy un principiante en PHP y me gustaría saber c...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos