WordPress Transients API — очень полезный инструмент, позволяющий разработчикам кэшировать данные, например, результаты запросов для будущих пользователей.
В этой статье собраны наиболее полезные практические примеры использования Transients API.
Что такое Transients API? Чем он так полезен?
Если вы работали с WordPress, то наверное, уже слышали об Options API, позволяющим сохранять, обновлять и удалять пользовательские данные. Transients API очень похож на Options API, но со сроком действия, что упрощает процесс использования таблицы базы данных wp_options
для хранения кэшированных данных.
Дополнительную информацию о
Список сайтов из вашей сети
Начнем с интересного сниппета для тех, кто держит сеть из множества блогов. С помощью кода, расположенного ниже, можно выводить в меню список всех сайтов сети. В этом случае, API нужен для сохранения данных на определенное время ( которым можно управлять с помощью переменной $expires
). Таким образом вам не нужно будет делать кучу запросов к базам данных для генерации меню.
Чтобы этот сниппет заработал, нужно скопировать предлагаемый код в файл functions.php
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
function wp_list_sites( $expires = 7200 ) { if( !is_multisite() ) return false; // Because the get_blog_list() function is currently flagged as deprecated // due to the potential for high consumption of resources, we'll use // $wpdb to roll out our own SQL query instead. Because the query can be // memory-intensive, we'll store the results using the Transients API if ( false === ( $site_list = get_transient( 'multisite_site_list' ) ) ) { global $wpdb; $site_list = $wpdb->get_results( $wpdb->prepare('SELECT * FROM wp_blogs ORDER BY blog_id') ); // Set the Transient cache to expire every two hours set_site_transient( 'multisite_site_list', $site_list, $expires ); } $current_site_url = get_site_url( get_current_blog_id() ); $html = ' <ul id="network-menu">' . "\n"; foreach ( $site_list as $site ) { switch_to_blog( $site->blog_id ); $class = ( home_url() == $current_site_url ) ? ' class="current-site-item"' : ''; $html .= "\t" . ' <li id="site-' . $site->blog_id . '" '="" .="" $class=""><a href="' . home_url() . '">' . get_bloginfo('name') . '</a></li> ' . "\n"; restore_current_blog(); } $html .= '</ul> <!--// end #network-menu -->' . "\n\n"; return $html; } |
Функционал для отображения меню готов, после вставляете следующие строки в файлы вашей темы.
1 2 3 4 5 6 7 8 9 10 11 |
<?php // Multisite Network Menu $network_menu = wp_list_sites(); if( $network_menu ): ?> <div id="network-menu"> <?php echo $network_menu; ?> </div> <!--// end #network-menu --> <?php endif; ?> |
Источник:
Количество твиттер фолловеров с помощью WordPress Transients
Большинство блогов отображают, как много людей следят за ними в Твиттере. Довольно просто получить немного данных json, но это требует определенного количества времени. Используя Transients, вы можете забирать данные раз в день и сохранять их в вашей базе данных.
Сначала вставьте код в файл functions.php
, после в нужном файле темы пропишите вызов функции my_followers_count
с вашим именем твиттер-аккаунта :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function my_followers_count($screen_name = 'mytwittername'){ $key = 'my_followers_count_' . $screen_name; // Let's see if we have a cached version $followers_count = get_transient($key); if ($followers_count !== false) return $followers_count; else { // If there's no cached version we ask Twitter $response = wp_remote_get("http://api.twitter.com/1/users/show.json?screen_name={$screen_name}"); if (is_wp_error($response)) { // In case Twitter is down we return the last successful count return get_option($key); } else { // If everything's okay, parse the body and json_decode it $json = json_decode(wp_remote_retrieve_body($response)); $count = $json->followers_count; // Store the result in a transient, expires after 1 day // Also store it as the last successful using update_option set_transient($key, $count, 60*60*24); update_option($key, $count); return $count; } } } echo "I have " . my_followers_count('mytwittername') . " followers"; |
Источник: http://kovshenin.com/2010/05/twitter-followers-count-snippet-for-wordpress-2253/
Количество RSS подписчиков с помощью WordPress Transients
При отображении числа RSS подписчиков будем использовать ту же технологию, что и при выводе количества фолловеров. Не забудьте поменять в коде в строке 2 слово yourname
на ваше имя. Код функции заносите в файл functions.php
, ее вызов в файле темы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function feed_subscribers(){ $feed_url = 'http://feeds.feedburner.com/yourname'; $count = get_transient('feed_count'); if ($count != false) return $count; $count = 0; $data = wp_remote_get('http://feedburner.google.com/api/awareness/1.0/GetFeedData?uri='.$feed_url.''); if (is_wp_error($data)) { return 'error'; }else{ $body = wp_remote_retrieve_body($data); $xml = new SimpleXMLElement($body); $status = $xml->attributes(); if ($status == 'ok') { $count = $xml->feed->entry->attributes()->circulation; } else { $count = 300; // fallback number } } set_transient('feed_count', $count, 60*60*24); // 24 hour cache echo $count; } |
Источник: https://wpsnipp.com/index.php/functions-php/get-feedburner-count-using-get_transient-and-wp_remote_get/
Кэшированное навигационное меню
Предоставленная в WordPress 3.0 новая система меню несоменно стала лучше. А при использовании Transients API, мы сможем сделать ее еще лучше, убрав неимоверное количество запросов к базе данных при ее создании.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
<?php /** * Wrapper function around wp_nav_menu() that will cache the wp_nav_menu for all tag/category * pages used in the nav menus * @see http://lookup.hitchhackerguide.com/wp_nav_menu for $args * @author tott */ function hh_cached_nav_menu( $args = array(), $prime_cache = false ) { global $wp_query; $queried_object_id = empty( $wp_query->queried_object_id ) ? 0 : (int) $wp_query->queried_object_id; // If design of navigation menus differs per queried object use the key below // $nav_menu_key = md5( serialize( $args ) . '-' . $queried_object_id ); // Otherwise $nav_menu_key = md5( serialize( $args ) ); $my_args = wp_parse_args( $args ); $my_args = apply_filters( 'wp_nav_menu_args', $my_args ); $my_args = (object) $my_args; if ( ( isset( $my_args->echo ) && true === $my_args->echo ) || !isset( $my_args->echo ) ) { $echo = true; } else { $echo = false; } $skip_cache = false; $use_cache = ( true === $prime_cache ) ? false : true; // If design of navigation menus differs per queried object comment out this section //* if ( is_singular() ) { $skip_cache = true; } else if ( !in_array( $queried_object_id, hh_get_nav_menu_cache_objects( $use_cache ) ) ) { $skip_cache = true; } //*/ if ( true === $skip_cache || true === $prime_cache || false === ( $nav_menu = get_transient( $nav_menu_key ) ) ) { if ( false === $echo ) { $nav_menu = wp_nav_menu( $args ); } else { ob_start(); wp_nav_menu( $args ); $nav_menu = ob_get_clean(); } if ( false === $skip_cache ) set_transient( $nav_menu_key, $nav_menu ); } if ( true === $echo ) echo $nav_menu; else return $nav_menu; } /** * Invalidate navigation menu when an update occurs */ function hh_update_nav_menu_objects( $menu_id = null, $menu_data = null ) { hh_cached_nav_menu( array( 'echo' => false ), $prime_cache = true ); } add_action( 'wp_update_nav_menu', 'hh_update_nav_menu_objects' ); /** * Helper function that returns the object_ids we'd like to cache */ function hh_get_nav_menu_cache_objects( $use_cache = true ) { $object_ids = get_transient( 'hh_nav_menu_cache_object_ids' ); if ( true === $use_cache && !empty( $object_ids ) ) { return $object_ids; } $object_ids = $objects = array(); $menus = wp_get_nav_menus(); foreach ( $menus as $menu_maybe ) { if ( $menu_items = wp_get_nav_menu_items( $menu_maybe->term_id ) ) { foreach( $menu_items as $menu_item ) { if ( preg_match( "#.*/category/([^/]+)/?$#", $menu_item->url, $match ) ) $objects['category'][] = $match[1]; if ( preg_match( "#.*/tag/([^/]+)/?$#", $menu_item->url, $match ) ) $objects['post_tag'][] = $match[1]; } } } if ( !empty( $objects ) ) { foreach( $objects as $taxonomy => $term_names ) { foreach( $term_names as $term_name ) { $term = get_term_by( 'slug', $term_name, $taxonomy ); if ( $term ) $object_ids[] = $term->term_id; } } } $object_ids[] = 0; // that's for the homepage set_transient( 'hh_nav_menu_cache_object_ids', $object_ids ); return $object_ids; } |
Источник:
Кэшированное облако тэгов
Следующий функционал поможет вам создать кэшированное облако тэгов. Просто вставьте код в нужное место вашей темы.
1 2 3 4 5 6 7 |
$tag_cloud = get_transient( 'tag_cloud' ); if ( false === $tag_cloud || '' === $tag_cloud ){ $args = array('echo' => false); $tag_cloud = wp_tag_cloud( $args ); set_transient( 'tag_cloud', $tag_cloud, 60*60*12 ); } echo $tag_cloud; |
Источник:
Кэширование любого запроса с помощью Transients
Если вы используете свои запросы, то их тоже можно кэшировать. Код, расположенный ниже, подскажет, как это сделать.
1 2 3 4 5 6 7 8 9 10 |
<?php // Get any existing copy of our transient data if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) { // It wasn't there, so regenerate the data and save the transient $special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' ); set_transient( 'special_query_results', $special_query_results ); } // Use the data like you would have normally... ?> |
Источник: