wp_nav_menu + wpml + transients

wp_nav_menu este o funcție din WordPress ce afișează un meniu. Problema este că, în combinație cu WPML*, este lent. Al dracului de lent! Dacă în producție nu e nici o problemă (caching), când dezvolți un site este o problemă să aștepți câteva secunde la încărcare. Prin urmare, orice optimizare se poate face, este binevenită.

Am dat azi de articolul ăsta care mi-a adus aminte de o chestie pe care am încercat-o și eu la un moment dat, dar de care am uitat cu desăvârșire (deh, am avut și norocul de a face câteva proiecte fără WPML).

Prin urmare, avem așa:

function wp_nav_menu_cached( $options = array() ){
  $shouldNotEcho   = ( isset( $options['echo'] ) && !$options['echo'] );
  $options['echo'] = false;
  $cache_key       = apply_filters( 'ntz/wp_nav_menu_cache_name', ( 'wp_nav_menu_cached' . ICL_LANGUAGE_NAME ) );
  $cache           = get_transient( $cache_key );
  $cachedMenu      = isset( $cache[ $options['menu'] ] ) ? $cache[ $options['menu'] ] : false;

  if( !$cachedMenu ){
    $cache[ $options['menu'] ] = wp_nav_menu( $options );
    set_transient( $cache_key, $cache, WEEK_IN_SECONDS );
  }

  if( $shouldNotEcho ) {
    return $cache[ $options['menu'] ];
  }else {
    echo $cache[ $options['menu'] ];
  }
}

function wp_nav_menu_clear_cache() {
  $cache_key = apply_filters( 'ntz/wp_nav_menu_cache_name', ( 'wp_nav_menu_cached' . ICL_LANGUAGE_NAME ) );
  delete_transient( $cache_key );
}

add_action( 'wp_update_nav_menu', 'wp_nav_menu_clear_cache' );

Foarte ușor de folosit, în loc de wp_nav_menu folosești wp_nav_menu_cached. Opțiunile din codex rămân valabile.

*Pentru cine nu știe, WPML este singura soluție de luat în seamă când vine vorba de WordPress multilanguage. Din păcate este și extrem de prost scris: extrem de lent, clase interminabile (9500+ linii), metode pe măsură (500+ linii), aproape imposibil de extins fără a modifica și codul plugin-ului șamd.

EDIT
Dan a ridicat o problemă foarte importantă: având cache la meniuri va fi imposibil de indicat pagina curentă. Ăsta a fost și motivul pentru care am „uitat” de această metodă.

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>

windows apple dropbox facebook twitter