WordPress the post

В этой статье:
Цикл WordPress и дополнительные циклы
функции have_posts(), the_post(), rewind_posts(), query_posts(), wp_reset_postdata()
объект WP_Query
глобальные массивы $wp_query $posts

Цикл WordPress

Цикл WordPress имеет такой вид:

// если есть записи <?php if (have_posts()) : ?>  // пока есть записи, извлекать по одной записи  <?php while (have_posts()) : the_post(); ?>  <!--обработка ... -->  <?php endwhile; ?> <?php endif; ?>

Функции have_posts() и the_post() работают с глобальным (global) объектом $wp_query, который вызывается в header блога. При этом формируется и выполняется запрос к базе данных (БД), возвращающий массив записей блога, который затем хранится в этом объекте, а также в глобальном массиве $posts (для обеспечения обратной совместимости).

have_posts() (вызывает $wp_query->have_posts()) проверяет, есть ли еще записи в массиве записей

the_post() (вызывает $wp_query->the_post()) заполняет глобальную переменную $post и все глобальные данные, связанные с текущей извлекаемой записью, и увеличивает счетчик цикла.

Несколько циклов на одной странице


Для того чтобы в случае необходимости выполнить цикл еще раз, нужно «отмотать все назад» с помощью функции

<?php rewind_posts(); ?>

Или можно использовать функцию query_posts(), которая выполняет новый запрос, создает новый массив записей и отматывает назад счетчик цикла.

Если нужно сохранить (не перезаписывать) результаты исходного запроса, можно создать копию $wp_query или создать новый объект запроса.

Использование функции query_posts()

// 10 последних записей из категории cat1 <?php query_posts('category_name=cat1&posts_per_page=10'); ?> <?php while (have_posts()) : the_post(); ?> ... <?php endwhile;?>

Внимание! Чтобы не нарушалась «пагинация» — работа ссылок «Предыдущие записи» — для функции query_posts() необходимо использовать параметр paged:

 $page_num = $paged;  if ($pagenum='') $pagenum =1;  query_posts('showposts=4&paged='.$page_num=3');

Рекомендации автора плагина PageNavi (wp_pagenavi ):


Плагин wp_pagenavi создает страничную навигацию (страница 1, страница 2 и т.д.) для страниц записей, но навигация не будет работать, если в теме используется вызов функции query_posts() вида

query_posts('cat=8'); или query_posts( array( 'cat' => 8 ) );

Должно быть так:

query_posts( array( 'cat' => 8, 'paged' => get_query_var('paged') ) );

если это не сработает, попробуйте передать переменную page:

query_posts( array( 'cat' => 8, 'paged' => get_query_var('page') ) );

(http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html)

Внимание! Использование функции query_posts() означает изменение глобального массива и не рекомендуется. Предпочтительнее создание нового объекта  WP_Query или применение фильтра pre_get_posts .

Создание нового объекта  WP_Query

Если нужно сохранить (не перезаписывать) результаты исходного запроса, можно создать копию $wp_query или создать новый объект запроса. Вот, например, два цикла: сначала вывод одной записи из рубрики featured и затем вывод последних добавленных записей, исключая первую выведенную запись


<?php $my_query = new WP_Query('category_name=featured&posts_per_page=1'); while ($my_query->have_posts()) : $my_query->the_post(); $do_not_duplicate = $post->ID; ?> ... <?php endwhile; ?> ... <?php if (have_posts()) : while (have_posts()) : the_post(); if( $post->ID == $do_not_duplicate ) continue;?> ... <?php endwhile; endif; ?>

Или вывод нескольких записей в первом цикле:

<?php $my_query = new WP_Query('category_name=featured&posts_per_page=3'); while ($my_query->have_posts()) : $my_query->the_post();  $do_not_duplicate[] = $post->ID ?> // массив id записей ... <?php endwhile; ?> ... <?php if (have_posts()) : while (have_posts()) : the_post();  if (in_array($post->ID, $do_not_duplicate)) continue;  ?> ... <?php endwhile; endif; ?>

Можно пойти и другим путем — сразу исключить из запроса записи из массива:

<?php query_posts(array('post__not_in'=>$do_not_duplicate));  if (have_posts()) : while (have_posts()) : the_post();  ?>

Вложенные циклы

Цикл внутри основного (по окончании внутреннего цикла продолжается внешний цикл ):

$my_query = new WP_Query( "cat=3" ); if ( $my_query->have_posts() ) {  while ( $my_query->have_posts() ) {  $my_query->the_post();  the_content();  } } // Установка некоторых глобальных переменных: wp_reset_postdata();

Изменение количества записей только на главной странице — query_posts


Новый запрос с помощью функции query_posts():

<?php if (is_front_page()) {  $page_num = $paged;  if ($pagenum='') $pagenum =1;  query_posts('showposts=4&paged='.$page_num);  }  ?>  <?php //while ( have_posts() ) : the_post(); ?>

На главной будут выводиться 4 записи, а на страницах рубрик, меток и т.д.   — в соответствии с настройкой, заданной в

Параметры — Чтение — На страницах блога отображать не более 10 записей

Изменение запросов с помощью фильтра pre_get_posts

Фильтр pre_get_posts применяется после формирования запроса но до его выполнения, т.е. его использование не создает дополнительной нагрузки!

Исключение рубрик на главной странице

Если нужно не показывать  на главной / домашней странице записи блога из некоторых рубрик (например, с id= ‘1’ и ’67’), используйте в плагине или добавьте в файл functions.php код:

function exclude_category( $query ) {  if ( $query->is_home() && $query->is_main_query() ) {  $query->set( 'cat', '-1,-67' );  } } add_action( 'pre_get_posts', 'exclude_category' );

Изменение количества записей для разных случаев

В WordPress есть одна глобальная настройка для количества записей на главной странице блога и на страницах рубрик, архивов по месяцам и т.д. (Параметры — Чтение). Применяя фильтр, можно избирательно изменять эту и другие настройки, например, для главной страницы или страницы определенной рубрики.


Пример изменения параметра ‘posts_per_page’ (записей на странице):

function change_posts_per_page( $query ) {  // изменять не в админке и только главный запрос  if ( is_admin() || ! $query->is_main_query() )  return;   if ( is_home() ) {  // На главной показывать только 1 запись  $query->set( 'posts_per_page', 1 );  return;  }   if ( is_post_type_archive( 'movie' ) ) {  // 50 записей в архиве произвольноготипа'movie'  $query->set( 'posts_per_page', 50 );  return;  } } add_action( 'pre_get_posts', 'change_posts_per_page', 1 );

mblogm.ru

We love WordPress – but not all of us are ready to settle with all its default settings and displays – particularly how posts are displayed. As we’re taught that uniqueness does matter to a website’s branding which gives the visitors a great impression, throughout these years bloggers and developers have been striving to tweak the post display, in order to make it as unique as possible.

Today we are going to focus on the smart tweaks you can perform to improve your WordPress post display. Whether you are looking to change your post display to enhance user experience or to increase revenue or page impressions, chances are there is a way to do it without plugin, and most of the snippets listed here are easy to implement, in most time you just need to copy and paste the provided code.


Hope you will find these tweaks useful for your projects, enjoy customizing!

Front End

1. Change your excerpt length

The tweak below will change your excerpt length, which you can just add the following lines of code into your functions.php file, with the value 75 as the excerpt length.

  add_filter('excerpt_length', 'my_excerpt_length');  function my_excerpt_length($len) { return 75; }  

[Source: Danny van Kooten]

2. Twitter style “time ago” dates

Most people don’t know that WordPress has a built-in function to display the date using the “Time Ago” format, and the snippet below can be pasted to anywhere within the loop to display the date with the format.

  Posted <?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' ago';  

[Source: PHP Snippets]

3. Display post thumbnail in your RSS feed

Introduced in WordPress 2.9, the the_post_thumbnail() function is very useful to add and display a thumbnail attached to a post. The bad news is there’s no built-in method to display the thumbnail in your RSS feed. The function below will solve this problem. Simply paste it into your functions.php file, save it, and the post thumbnail will be automatically displayed in your RSS feed.


  // show post thumbnails in feeds  function diw_post_thumbnail_feeds($content) {	global $post;	if(has_post_thumbnail($post->ID)) {		$content = '<div>' . get_the_post_thumbnail($post->ID) . '</div>' . $content;	}	return $content;}add_filter('the_excerpt_rss', 'diw_post_thumbnail_feeds');add_filter('the_content_feed', 'diw_post_thumbnail_feeds');  

[Source: Digging into WordPress]

4. Limit search to post titles only

You can add this snippet into the functions.php file of your WordPress Themes to limit the search to post titles only.

  function __search_by_title_only( $search, &$wp_query )   {   if ( empty($search) )   return $search; // skip processing - no search term in query   $q =& $wp_query->query_vars;      // wp-includes/query.php line 2128 (version 3.1)   $n = !empty($q['exact']) ? '' : '%';   $searchand = '';   foreach( (array) $q['search_terms'] as $term ) {   $term = esc_sql( like_escape( $term ) );   $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";   $searchand = ' AND ';   }   $term = esc_sql( like_escape( $q['s'] ) );   if ( empty($q['sentence']) && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] )   $search .= " OR ($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";   if ( !empty($search) ) {   $search = " AND ({$search}) ";   if ( !is_user_logged_in() )   $search .= " AND ($wpdb->posts.post_password = '') ";   }   return $search;   }  add_filter( 'posts_search', '__search_by_title_only', 10, 2 );  

[Source: WpSnipp]

5. Display an incrementing number on each post

The tweak below will let you display an incrementing number on each post, and implementing it is pretty simple. First, paste the following function into your functions.php file:

  function updateNumbers() {   global $wpdb;   $querystr = "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' ";   $pageposts = $wpdb->get_results($querystr, OBJECT);   $counts = 0 ;   if ($pageposts):   foreach ($pageposts as $post):   setup_postdata($post);   $counts++;   add_post_meta($post->ID, 'incr_number', $counts, true);   update_post_meta($post->ID, 'incr_number', $counts);   endforeach;   endif;  }    add_action ( 'publish_post', 'updateNumbers' );  add_action ( 'deleted_post', 'updateNumbers' );  add_action ( 'edit_post', 'updateNumbers' );  

Once you’re done, you can display the post number with the following code. Note that it has to be used within the loop.

  <?php echo get_post_meta($post->ID,'incr_number',true); ?>  

[Source: Alchymyth, via WpRecipes]

6. Exclude Post from WordPress Feed

Looking to exclude certain posts from your feed? Here’s the tweak for you. Please be noted that you should only filter where you want to filter; in our example it is in our feed $wp_query->is_feed
. If you didn’t make it that way, the filter would also run in your back end and these posts won’t be shown on post overview.

The function has two parameters. You give the first parameter $where an extension of the SQL string, which will be taking care of the filtering based on the ID. Then, within the brackets you need to insert the IDs of the posts, which you like to filter.

  function fb_post_exclude($where, $wp_query = NULL) {  	global $wpdb;  	if ( !$wp_query )  		global $wp_query;  	if ($wp_query->is_feed) {  		// exclude post with id 40 and 9  		$where .= " AND $wpdb->posts.ID NOT IN (40, 9)";  	}  	return $where;  	}  add_filter( 'posts_where','fb_post_exclude', 1, 2 );  

[Source: WP Engineer]

7. Redirect to post when search query returns single result

Put this snippet into the functions.php file of your WordPress theme to redirect your search to the post automatically when WordPress only returns a single search result.


  add_action('template_redirect', 'single_result');  function single_result() {  	if (is_search()) {  		global $wp_query;  		if ($wp_query->post_count == 1) {  			wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );  		}  	}  }  

[Source: WpSnipp]

8. Automatically create meta description from the_content

Adding this snippet into the functions.php file of your WordPress theme will automatically create a meta description from your WordPress post, striping out all shortcodes and tags. Also ensure that you have it in the header.php of your WordPress theme or this snippet will not function.

  function create_meta_desc() {  	global $post;  	if (!is_single()) { return; }  	$meta = strip_tags($post->post_content);  	$meta = strip_shortcodes($post->post_content);  	$meta = str_replace(array("n", "r", "t"), ' ', $meta);  	$meta = substr($meta, 0, 125);  	echo "<meta name='description' content='$meta' />";  }  add_action('wp_head', 'create_meta_desc');  

[Source: WpSnipp]

9. Automatically replace words by affiliate links

To replace words by affiliate links automatically, simply paste the code below into your functions.php file. Remember to enter your words/links as shown in the example code below.

  function replace_text_wps($text){  	$replace = array(  	// 'WORD TO REPLACE' => 'REPLACE WORD WITH THIS'  	'thesis' => '<a href="http://mysite.com/myafflink">thesis</a>',  	'studiopress' => '<a href="http://mysite.com/myafflink">studiopress</a>'  	);  	$text = str_replace(array_keys($replace), $replace, $text);  	return $text;  }    add_filter('the_content', 'replace_text_wps');  add_filter('the_excerpt', 'replace_text_wps');  

[Source: catswhoblog.com]

10. Add “Read More” permalink to the end of the_excerpt

Adding this snippet below into the functions.php file of your WordPress theme will add a “read more” permalink at the end of the_excerpt, pretty much like what the_content does.

  function excerpt_readmore($more) {  	return '... <a href="'. get_permalink($post->ID) . '" class="readmore">' . 'Read More' . '</a>';  }  add_filter('excerpt_more', 'excerpt_readmore');  

[Source: WpSnipp]

11. Show related posts without a plugin

Installing the code below will make your WordPress site display related posts based on the current post tag(s). You need to place it inside single.php, or simply anywhere you want to show the related posts.

  <?php   $tags = wp_get_post_tags($post->ID);   if ($tags) {   	$tag_ids = array();   	foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id;   	$args=array(   	'tag__in' => $tag_ids,   	'post__not_in' => array($post->ID),   	'showposts'=>5, // Number of related posts that will be shown.   	'caller_get_posts'=>1   	);   $my_query = new wp_query($args);   	if( $my_query->have_posts() ) {   		echo '<h3>Related Posts</h3><ul>';   		while ($my_query->have_posts()) {   			$my_query->the_post();   			?>   			<li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>   		<?php   		}   		echo '</ul>';   	}   }  ?>  

[Source: Bin-Co]

12. Create Your Own Popular Posts in the Sidebar

Setting up a sidebar widget to display popular posts is very easy. Just copy and paste the code below into your sidebar.php file. If you need to change the number of posts shown, you can change the 5 at the end of line 3 to any number you prefer.

  <h2>Popular Posts</h2>  <ul>  	<?php $result = $wpdb->get_results("SELECT comment_count,ID,post_title FROM $wpdb->posts ORDER BY comment_count DESC LIMIT 0 , 5");   	foreach ($result as $post) {   		setup_postdata($post);  		$postid = $post->ID;   		$title = $post->post_title;   		$commentcount = $post->comment_count;   		if ($commentcount != 0) { ?>   			<li><a href="<?php echo get_permalink($postid); ?>" title="<?php echo $title ?>">  			<?php echo $title ?></a> {<?php echo $commentcount ?>}</li>  	<?php } } ?>  </ul>  

[Source: Pro Blog Design]

13. Set post expiration Date/Time

Below is a useful code that you can put into your WordPress Themes to enable the possibility of creating post expiration based on date and time. Edit your theme and replace your current WordPress loop with this «hacked» loop:

  <?php  if (have_posts()) :  	while (have_posts()) : the_post(); ?>  	$expirationtime = get_post_custom_values('expiration');  	if (is_array($expirationtime)) {  		$expirestring = implode($expirationtime);  	}  	$secondsbetween = strtotime($expirestring)-time();  	if ( $secondsbetween > 0 ) {  		// For exemple... the_title();  		the_excerpt();  		}  	endwhile;  endif;  ?>  

To create a post with date/time expiration, you can just create a custom field. Give expiration as a key and your date/time (format: mm/dd/yyyy 00:00:00) as a value. The post will not show up after that particular timestamp.

[Source: WpRecipes]

14. List future posts

WordPress allows listing future posts, and to achieve this feature, simply paste the code to wherever you’d like you future posts to be displayed:

  <div id="zukunft">  	<div id="zukunft_header"><p>Future events</p></div>  	<?php query_posts('showposts=10&post_status=future'); ?>  	<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>    	<div>  		<p><strong><?php the_title(); ?></strong><?php edit_post_link('e',' (',')'); ?><br />  		<span class="datetime"><?php the_time('j. F Y'); ?></span></p>  	</div>  	  	<?php endwhile; else: ?><p>No future events scheduled.</p><?php endif; ?>  </div>  

[Source: WpRecipes]

15. Display AdSense to search engines visitors only

It’s possible to display the AdSense to the visitors from search engines’ results, and here’s the code to achieve it, just paste the code below into the theme’s functions.php file.

  function scratch99_fromasearchengine(){  	$ref = $_SERVER['HTTP_REFERER'];  	$SE = array('/search?', 'images.google.', 'web.info.com', 'search.', 'del.icio.us/search', 'soso.com', '/search/', '.yahoo.');  	foreach ($SE as $source) {  		if (strpos($ref,$source)!==false) return true;  	}  	return false;  }  

$SE array is where you specify the search engines. You can add new search engine by adding new element to the array, then just paste the following code anywhere in the template where you want your AdSense ads to be displayed, and it’s done! The ads will only be displayed to visitors from search engines’ results.

  if (function_exists('scratch99_fromasearchengine')) {  	if (scratch99_fromasearchengine()) {  		INSERT YOUR CODE HERE  	}  }  

[Source: Scratch99, via WpRecipes]

Back End

1. Allow more HTML tags in the editor

By default, WordPress editor doesn’t allow HTML tags which aren’t compliant with the XHTML 1.0 standard. However, the code shown below will force the editor to accept more tags. You can paste it into your theme’s functions.php file, save it, and the function is good to go.

  function fb_change_mce_options($initArray) {  	// Comma separated string od extendes tags  	// Command separated string of extended elements  	$ext = 'pre[id|name|class|style],iframe[align|longdesc|name|width|height|frameborder|scrolling|marginheight|marginwidth|src]';  	if ( isset( $initArray['extended_valid_elements'] ) ) {  	$initArray['extended_valid_elements'] .= ',' . $ext;  	} else {  		$initArray['extended_valid_elements'] = $ext;  	}  	  	// maybe; set tiny paramter verify_html  	//$initArray['verify_html'] = false;  	return $initArray;  }  add_filter('tiny_mce_before_init', 'fb_change_mce_options');  

[Source: WP Engineer]

2. Set default editor

Snippet below modifies the default editor in WordPress admin. You can go with the Visual Editor, or you can choose the HTML Editor, just add one of them into the functions.php file.

  # This sets the Visual Editor as default  add_filter( 'wp_default_editor', create_function('', 'return "tinymce";') );    # This sets the HTML Editor as default  add_filter( 'wp_default_editor', create_function('', 'return "html";') );  

[Source: WP-Snippets]

3. Set different editor stylesheets for different post types

With the following code pasted into your functions.php file, you can setup different editor stylesheets for different post types. You will need to adapt it, depending on your post types, and remember to change the stylesheets names as well.

  function my_editor_style() {  	global $current_screen;  	switch ($current_screen->post_type) {  		case 'post':  		add_editor_style('editor-style-post.css');  		break;  		  		case 'page':  		add_editor_style('editor-style-page.css');  		break;  	  		case 'portfolio':  		add_editor_style('editor-style-portfolio.css');  		break;  	}  }  add_action( 'admin_head', 'my_editor_style' );  

[Source: WPStorm]

4. allow upload of more file types

For certain reason, WordPress Uploader won’t let you upload certain file types, such as Textmate’s .tmCommand. If you need to upload those kinds of files to your WordPress site, here comes a functional snippet that allows you to do it, and you just need to paste it into your functions.php file. You can also add more file types by adding them on line 4, separated by a pipe (|).

  <?php  	function addUploadMimes($mimes) {  	$mimes = array_merge($mimes, array(  		'tmbundle|tmCommand|tmDragCommand|tmSnippet|tmLanguage|tmPreferences' => 'application/octet-stream'  	));  	return $mimes;   }  ?>  add_filter('upload_mimes', 'addUploadMimes');  

[Source: pioupioum.fr, via WpRecipes]

5. Enable TinyMCE editor for post the_excerpt

Putting the following snippet into the functions.php file of your WordPress theme will add the TinyMCE editor to the post excerpt’s textarea.

  function tinymce_excerpt_js(){ ?>  <script type="text/javascript">  	jQuery(document).ready( tinymce_excerpt );  	function tinymce_excerpt() {  	jQuery("#excerpt").addClass("mceEditor");  	tinyMCE.execCommand("mceAddControl", false, "excerpt");  	}  </script>  <?php }  add_action( 'admin_head-post.php', 'tinymce_excerpt_js');  add_action( 'admin_head-post-new.php', 'tinymce_excerpt_js');    function tinymce_css(){ ?>  <style type='text/css'>  	#postexcerpt .inside{margin:0;padding:0;background:#fff;}  	#postexcerpt .inside p{padding:0px 0px 5px 10px;}  	#postexcerpt #excerpteditorcontainer { border-style: solid; padding: 0; }  </style>  <?php }  add_action( 'admin_head-post.php', 'tinymce_css');  add_action( 'admin_head-post-new.php', 'tinymce_css');  

[Source: WpSnipp]

6. Post Formats – More Creative Ways For A Theme

The syntax below gives some of the possible post formats which can then be chosen and used directly in the article, and what you need to do is to put the code into your functions.php file of your theme.

  add_theme_support( 'post-formats', array( 'aside', 'audio', 'image', 'video' ) );  

[Source: WP Engineer]

7. Display Post Thumbnail Also In Edit Post and Page Overview

WordPress version 2.9 introduced the function of Post Thumbnail. It’s quite awesome, and to display post thumbnail also in Edit Post and Page Overview, you can put the following code into a Plugin or copy them into the functions.php file of the theme.

  if ( !function_exists('fb_AddThumbColumn') && function_exists('add_theme_support') ) {  // for post and page  add_theme_support('post-thumbnails', array( 'post', 'page' ) );  function fb_AddThumbColumn($cols) {  	$cols['thumbnail'] = __('Thumbnail');  	return $cols;  }    function fb_AddThumbValue($column_name, $post_id) {   $width = (int) 35;   $height = (int) 35;   if ( 'thumbnail' == $column_name ) {   // thumbnail of WP 2.9   $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );      // image from gallery   $attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );      if ($thumbnail_id)   $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );   elseif ($attachments) {   foreach ( $attachments as $attachment_id => $attachment ) {   $thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );   }   }  	if ( isset($thumb) && $thumb ) { echo $thumb; }  	else { echo __('None'); }  	}  }    // for posts  add_filter( 'manage_posts_columns', 'fb_AddThumbColumn' );  add_action( 'manage_posts_custom_column', 'fb_AddThumbValue', 10, 2 );    // for pages  add_filter( 'manage_pages_columns', 'fb_AddThumbColumn' );  add_action( 'manage_pages_custom_column', 'fb_AddThumbValue', 10, 2 );  }  

[Source: WP Engineer]

8. Create custom post status messages in admin

This tweak was originally written by the developer as a way for a client to display custom messages for each post an author creates. In this case a post could have a message as rejected, error, source, final, etc. You can change the messages just below the code’s comment, Array of custom status messages, just to ensure that you changed the class names as well, which you can change them after the comment, change color of messages below.

  add_filter('display_post_states', 'custom_post_state');  function custom_post_state($states) {   global $post;   $show_custom_state = get_post_meta($post->ID, '_status');   if ($show_custom_state) {   	$states[] = __('<span class="custom_state ' . strtolower($show_custom_state[0]) . '">' . $show_custom_state[0] . '</span>');   }   return $states;  }  add_action('post_submitbox_misc_actions', 'custom_status_metabox');    function custom_status_metabox() {   global $post;   $custom = get_post_custom($post->ID);   $status = $custom["_status"][0];   $i = 0;   /* ----------------------------------- */   /* Array of custom status messages */   /* ----------------------------------- */   $custom_status = array('Spelling', 'Review', 'Errors', 'Source', 'Rejected', 'Final', );   echo '<div class="misc-pub-section custom">';   echo '<label>Custom status: </label><select name="status">';   echo '<option class="default">Custom status</option>';   echo '<option>-----------------</option>';   for ($i = 0; $i < count($custom_status); $i++) {   if ($status == $custom_status[$i]) {   echo '<option value="' . $custom_status[$i] . '" selected="true">' . $custom_status[$i] . '</option>';   } else { echo '<option value="' . $custom_status[$i] . '">' . $custom_status[$i] . '</option>'; }   }      echo '</select>';   echo '<br /></div>';  }  add_action('save_post', 'save_status');    function save_status() {   global $post;   if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {   	return $post->ID;   }   update_post_meta($post->ID, "_status", $_POST["status"]);  }  add_action('admin_head', 'status_css');    function status_css() {   echo '<style type="text/css">   .default{font-weight:bold;}   .custom{border-top:solid 1px #e5e5e5;}   .custom_state{   font-size:9px;   color:#666;   background:#e5e5e5;   padding:3px 6px 3px 6px;   -moz-border-radius:3px;   }   /* ----------------------------------- */   /* change color of messages below */   /* ----------------------------------- */   .spelling{background:#4BC8EB;color:#fff;}   .review{background:#CB4BEB;color:#fff;}   .errors{background:#FF0000;color:#fff;}   .source{background:#D7E01F;color:#333;}   .rejected{background:#000000;color:#fff;}   .final{background:#DE9414;color:#333;}   </style>';  }  

[Source: WpSnipp]

9. Set maximum post title length

Adding this PHP code into the functions.php file of your WordPress theme will set a maximum number of words that can be displayed within your post title, quite handy tweaks!

  function maxWord($title){  	global $post;  	$title = $post->post_title;  	if (str_word_count($title) >= 10 ) //set this to the maximum number of words  	wp_die( __('Error: your post title is over the maximum word count.') );  }  add_action('publish_post', 'maxWord');  

[Source: WpSnipp]

10. How to change WordPress editor font

Hate the current font used in WordPress editor? It’s possible to be changed to modern font such as Monaco or Consolas, just paste the code into your WordPress theme’s functions.php file.

  function change_editor_font(){  	echo "<style type='text/css'>  	#editorcontainer textarea#content {  		font-family: Monaco, Consolas, "Andale Mono", "Dejavu Sans Mono", monospace;  		font-size:14px;  		color:#333;  		}  	</style>";  }  add_action("admin_print_styles", "change_editor_font");  

[Source: shailan.com, via WpRecipes]

11. Adding A Custom Field Automatically On Post/Page Publish

A code snippet for installing a custom field automatically to a page or post when they are published. You can just add the code below into your functions.php file, located inside your theme’s folder. Of course, don’t forget to change the custom field name.

  add_action('publish_page', 'add_custom_field_automatically');  add_action('publish_post', 'add_custom_field_automatically');    function add_custom_field_automatically($post_ID) {  	global $wpdb;  	if(!wp_is_post_revision($post_ID)) {  		add_post_meta($post_ID, 'field-name', 'custom value', true);  	}  }  

[Source: wpCanyon]

12. Get rid of unused post revisions

Here comes a very handy SQL query that will delete all posts revisions instantly as well as meta associated with it. You’ve to run the following query on your WordPress database, and all revisions (as well as meta associated with it) will be deleted from your database. One important note here, be sure to make a backup of your database before you run the code.

DELETE a,b,c  FROM wp_posts a  WHERE a.post_type = 'revision'  LEFT JOIN wp_term_relationships b  ON (a.ID = b.object_id)  LEFT JOIN wp_postmeta c ON (a.ID = c.post_id);  

[Source: Lesterchan.net]

13. Change excerpt length depending of the category

Ever wished to modify the excerpt length based on which category you are on? Here comes the code which grants your wish. Simply paste the code into your functions.php file, and don’t forget to change the category ID on line 3!

  add_filter('excerpt_length', 'my_excerpt_length');  function my_excerpt_length($length) {  	if(in_category(14)) {  		return 13;  	} else {  	return 60;  	}  }  

[Source: WpRecipes]

14. Disable posts auto saving

If for some critical reason you’d like to disable the function that autosaves your post while you’re editing it in the dashboard, it’s possible. Simply open your functions.php file and paste the following code into the file:

  function disableAutoSave(){  wp_deregister_script('autosave');  }  add_action( 'wp_print_scripts', 'disableAutoSave' );  

[Source: WpRecipes]

You can then save the file, and WordPress will never autosave a post. You can also get the function back by delete the code.

www.hongkiat.com

Вывод постов.

Для отображения постов в WordPress используется механизм The Loop. The Loop — это цикл, который служит для отображения всех постов существующих на данной странице. Также механизм служит для форматирования отображения поста в соответствии с Вашой темой. Пример механизма The Loop:

 <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> … <?php endif; ?> 

Для отображения постов мы и будем применять механизм The Loop. В посте мы будем отображать заголовок поста, сам контент, автора, дату публикации и категорию. Ну чтож, тогда изменим наш index.php следующим образом:

  <?php get_header() ?> <div id="content"> <div id="center">                 <?php                    if ( have_posts() ) :                        while ( have_posts() ) : the_post(); ?> <div> <h2></h2> <?php the_content() ?>  <?php the_author() ?>:<?php the_date() ?>:<?php the_category() ?></div>                     <?php endwhile;?>                     <?php else :                        echo "Sorry, no posts were found";                    endif;                    ?></div> <?php get_sidebar() ?> <?php get_footer() ?> 

Тут мы использовали следующие функции:

  • the_permalink — ссылка на текущий пост;
  • the_title — для отображения заголовка поста;
  • the_content — для отображения  контента поста;
  • the_author — для отображения автора поста;
  • the_date — для отображения даты публикации поста;
  • the_category — для отображения категорий данного поста.

Основные функции WordPress, которые могут понадобиться в отображении постов я опишу в дополнении к данному уроку. Давайте проверим, что у на получилось. Теперь создаваемая нами тема для WordPress выводит посты. (да, пока это выглядит не красиво, но путем добавления стилей мы можем сделать отображение постов так, как нам это необходимо)
Вывод отдельного поста.
Для отображения отдельного поста в WordPress есть файл single.php. Когда мы открываем отдельный пост, то WordPress ищет в теме файл c названием single.php. Если данный файл существует, то отображение отдельного поста будет происходить как описано в файле single.php. Если же файла с именем single.php нет, то отображение отдельного поста будет происходить как описано в index.php.
Давайте в корневой папке нашей темы мы создадим файл с названием single.php. Теперь мы хотим сделать, чтобы заголовок поста не являлся ссылкой, на данной странице отображались комментарии и была навигация на предыдущий пост/следующий пост. Для этого добавим в файл single.php следующий код:

 <?php get_header() ?> <div id="content"> <div id="center">                 <?php                    if ( have_posts() ) :                        while ( have_posts() ) : the_post(); ?> <div> <h2></h2> <?php the_content() ?>  <?php the_author() ?>:<?php the_date() ?>:<?php the_category() ?></div> <div>                               <?php comments_template() ?></div> <div> </div>                     <?php endwhile;?>                     <?php else :                        echo "Sorry, no posts were found";                    endif;                    ?></div> <?php get_sidebar() ?> <?php get_footer() ?> 

В данном коде мы использовали следующие функции:

  • comments_template — используется для загрузки шаблона комментариев. Данная функция может принимать два значения $file и $separate_comments. $file — служит для указания имени шаблона комментариев (по умолчанию comments.php), а второй $separate_comments — служит для отделения комментариев (по умолчанию false)
  • previous_post_link() — эта функция выводит ссылку на предыдущий пост. Данная функция должна использоваться в механизме The Loop. Может принимать следующие параметры $format, $link, $in_same_cat = false, $excluded_categories = », где $format — в данным параметром мы устанавливаем формат ссылки (по умолчанию <<%link, те будет стоять <<[ссылка на предыдущий пост]), $link — текст ссылки (по умолчанию %title, т.е. название поста), $in_same_cat = false — данный параметр указывает на, то что предыдущий пост должен быть из той же категории (по умолчанию flase, т.е. отображается предыдущий пост даже, если он не из той категории), $excluded_categories = » — ставяться ID категорий из которых не указывать посты (по умолчанию пусто);
  • next_post_link() — эта функция выводит ссылку на следующий пост. Принимает параметры аналогичные параметрам функции previous_post_link().

Сохраним и проверим.
На этом данный урок посвященный созданию собственной темы для WordPress я завершаю. На следующих уроках мы продолжим создавать тему для WordPress, а частности поговорим о создании отдельного шаблона страницы (page). Так, что не пропускайте выхода новых материалов, подписавшись на рассылку данного блога.
Скачать исходник данного урока Вы можете по этой ссылке. (в исходнике я немного изменил верстку и стили для того, чтобы наша тема для WordPress выглядела более привлекательно).
Если у Вас возникли вопросы, то пишите в комментариях. Я обязательно на них отвечу. А пока все. Всем удачной разработки.

web-programming.com.ua

Что такое цикл WordPress

Цикл WordPress это постоянно повторяющейся действие, которое позволяет обрабатывать массив информации и выводить нужную информацию на текущей странице поста, а также формировать страницу поста в соответствии с критериями указанными внутри этого цикла.

Любой код, имеется в виду HTML и PHP, размещенный внутри цикла будет повторяться для каждой записи. Например, специальный тег comments_link() который выводит ссылку на показ формы комментария , применяется внутри цикла WordPress и будет повторяться для каждой записи.

Классический пример цикла, в файле index.php. Данный файл отображает только содержимое каждого сообщения, в соответствии с условиями, использованными для подготовки Цикла. Этот пример показывает, как мало нужно для работы Цикла.

<?php  get_header();  if (have_posts()) :   while (have_posts()) :   the_post();   the_content();   endwhile;  endif; get_sidebar();  get_footer();  >

Например, в файле content.php есть цикл, в котором последовательно прописаны теги, выводящие заголовок статьи, содержание статьи, комментарии статьи. Следовательно, каждая статья будет начинаться с заголовка, потом содержание, потом комментарии. Но стоит поменять местами теги выводящие комментарии и содержания, все статьи будут начинаться с заголовка, потом комментарии, потом содержание.

В WordPress возможны четыре построения циклов для вывода записей:

  1. Стандартный цикл WordPress;
  2. Цикл WordPress на основе query_posts();
  3. Цикл WordPress на основе Wp_Query();
  4. Цикл WordPress на основе get_posts().

Стандартный цикл WordPress

Стандартный цикл WordPress это цикл с предусловием (оператор PHP while). В стандартном цикле мы не указываем данные для выборки записей. При входе в цикл вычисляется условие и, если его значение отлично от нуля, выполняется тело цикла. Поэтому, стандартный цикл сразу начинаем с if (have_posts()), и если запись присутствует, то тело цикла выполняется до его окончания, а данные после обработки выводятся на экран.

Пример стандартного цикла

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>  			<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>  				<h2 class="page-title"><?php the_title(); ?></h2> 				<?php edit_post_link(__( 'Edit', 'zeeTasty_lang' )); ?>  				<div class="entry clearfix"> 					<?php the_post_thumbnail('medium', array('class' => 'alignleft')); ?> 					<?php the_content(); ?>		 				</div> 				<?php wp_link_pages(); ?>  			</div>  		<?php endwhile; ?>  		<?php endif; ?>

Более точно, это работает так:

После того как WordPress загрузил заголовок блога и передал его в шаблон, переходим к Циклу записей. Функция have_posts() вызывает переменную $wp_query->have_posts(), которая проверяет счетчик цикла на наличие любых записей во всем массиве записей. Также функция the_post() вызывает переменную $wp_query->the_post(), которая увеличивает счетчик цикла и устанавливает глобальную переменную $post, аналогично всем данным записей. Выполнив цикл один раз, функция have_posts() вернет false(нет) и цикл закончится.

Цикл WordPress на основе query_posts()

Функция query_posts() позволяет изменить базовый запрос и вывести нужный нам вариант записей. query_posts() не предназначена для создания нового цикла, а только для изменения стандартного цикла.

Другими словами, цикл WordPress на основе query_posts() это стандартный цикл WordPress с измененными (дополненными) параметрами запроса. Например, функцией query_posts() можно вырезать отдельные категории или изменить порядок сортировки или убрать отдельные статьи или изменить количество записей.

Важно: при вызове query_posts создается новый объект wp_query, который затем будет использоваться в цикле, поэтому функция query_posts должна располагаться перед стандартным циклом WordPress. При таком расположении WordPress перестает учитывать параметры записи, полученные из URL, и цикл выполняется с параметрами запроса query_posts().

Пример цикла на основе query_posts()

<?php  query_posts($args); //$args - параметры запроса   // [Стандартный Цикл WordPress]  wp_reset_query(); // сброс запроса  ?>

Еще пример

<?php // Запрос -The Query query_posts( $args );  // The Loop-стандартный цикл while ( have_posts() ) : the_post();  echo '<li>';  the_title();  echo '</li>'; endwhile;  // Reset Query- сброс (остановка) guery wp_reset_query(); ?>

Здесь стоит поговорить, про параметры функции query_posts(). Находится query_posts() в файле wp-includes/query.php.

Цикл WordPress на основе WP_Query()

Цикл WordPress на основе класса WP_Query() используется для вывода записей, которые никак не связанны со страницей или для создания множественных циклов. Выглядят эти циклы аналогично циклам с использование функции query_posts(). Параметры для WP_Query() такие же.

Особенностью циклов на основе WP_Query() является создание нового объекта ($query), который не связан с аналогичным глобальным объектом $wp_query и поэтому никак не нарушается структура текущей страницы.

Так же, мы можем использовать новый объект в других целях, не только для вывода записей, но и для различного рода проверок.

Пример цикла WP_query()

<?php // The Query $query = new WP_Query( $args );  // The Loop if ( $query->have_posts() ) { 	while ( $query->have_posts() ) { 		$query->the_post(); 		echo '<li>' . get_the_title() . '</li>'; 	} } else { 	// Сообщения не найдены } /* Восстановления исходных данных сообщение */ wp_reset_postdata();

Пример множественных циклов WP_guery

<?php  // The Query $the_query = new WP_Query( $args );  // The Loop while ( $the_query->have_posts() ) { 	$the_query->the_post(); 	echo '<li>' . get_the_title() . '</li>'; }  /* Восстановления исходных данных сообщения   * Примечание: Так как мы далее создаем новые WP_Query мы не топтать   * Оригинальная wp_query $, и это не дмолжны быть сброшены. */ wp_reset_postdata();  /* Второй Query (without global var) */ $query2 = new WP_Query( $args2 );  // Второй Loop while( $query2->have_posts() ) { 	$query2->next_post(); 	echo '<li>' . get_the_title( $query2->post->ID ) . '</li>'; }  // Восстановления исходных данных сообщение wp_reset_postdata(); //wp_reset_postdata() используется как раз для того,  //чтобы вернуть правильные данные в переменную $post. ?>

Цикл WordPress на основе get_posts()

Функция get_posts() используется для создания еще одного цикла, помимо основного. get_posts() получает записи (посты, страницы, вложения) из Базы Данных по указанным критериям.

Цикл WordPress на основе get_posts() считается самым удобным вариантом вывода нужных записей в нужном порядке. get_posts() в большинстве случаев полностью заменяет функцию WP_query(). Например,

  • если нужно вывести 7 последних постов в сайдбаре или
  • несколько случайных записей в футере — нет проблем;
  • нужно вывести все картинки, прикрепленные к посту или
  • вывести записи с определенным произвольным полем — get_posts() справится и с этим.

Функция get_posts() аналогично с query_posts() работает на основе класса WP_query() и поэтому передаваемые параметры одинаковые.

Примечание: Класс WordPress (тоже, что и класс php), это самодостаточный код выполняющий определенную функцию. Класс имеет свое имя, содержит собственные константы, переменные (называемые свойствами) и функции (называемые методами).

Пример цикла get_posts()

Выведем 5 записей из рубрики 13

<?php global $post; // не обязательно $args = array('category' => 13); // 5 записей из рубрики 13 $posts = get_posts($args); foreach( $posts as $post ){ setup_postdata($post); 	// стандартный вывод записей } wp_reset_postdata(); // сбрасываем переменную $post ?>

На этом про Цикл WordPress все!

©www.wordpress-abc.ru

www.wordpress-abc.ru

Настраиваем query_posts()

Типичный цикл по умолчанию выглядит вот так:

 <?php // The WordPress Loop if (have_posts()) : while (have_posts()) : the_post(); ... endwhile; else: ... endif; ?>

Информация, отображаемая в цикле, зависит от огромного количества факторов, включая запрашиваемый урл и соответствующий шаблон, генерирующий страницу. Например, когда кто-то посещает главную страницу сайта, исходный цикл выводит записи из всех категорий в количестве, заданном в админке.

Но что, если мы хотим вместо отображения записей из всех категорий исключить содержимое определенной, чтобы вывести их в отдельном месте страницы. Это идеальная задача для query_posts(), которая легко с ней справится:

 <?php query_posts('cat=-9'); // исключаем категорию с ID = 9 if (have_posts()) : while (have_posts()) : the_post(); ... endwhile; else: ... endif; ?>

Но нужно учитывать необходимость внести некоторые модификации в стандартный код вызова: убедиться, что запрос был сделан правильно и сбросить запрос в состояние по умолчанию сразу после выполнения.

 <?php  global $query_string;  $posts = query_posts($query_string.'&cat=-9'); if (have_posts()) : while (have_posts()) : the_post(); ... endwhile; else: ... endif; wp_reset_query(); ?>

Тег wp_reset_query восстанавливает оригинальный запрос query_posts и используется при применении в шаблонах нескольких последовательных циклов.

Используя такой шаблон можно легко вносить нужные правки в запрос, например, сделав такой

$posts = query_posts($query_string.'&cat=-7,-8,-9&posts_per_page=3&order=ASC');

что значит вывести 3 записи, исключив 7,8,9 категории и отсортировать записи по алфавиту.

Ключ к успешному использованию query_posts заключается в сохранении оригинального формата запроса с помощью $query_string переменных. Будучи однажды подключенными, можно добавить столько параметров, сколько нужно (подробнее тут https://codex.wordpress.org/Function_Reference/WP_Query#Parameters ).

Этот способ хорош, но не лишен недостатков. query_posts использует дополнительные запросы к базе данных и может повлиять на работоспособность других условных тегов, таких как is_page() и is_ single(). Поэтому рекомендуется не использовать этот способ, хотя он и работоспособен, а заменить его на WP_Query с которым точно проблем не будет.

Настраиваем WP_Query

Для полного контроля над любым количеством циклов, WP_Query – самый лучший способ. Если нужно модифицировать дефолтовый цикл, то это выглядит очень похоже на query_posts:

 <?php // The WordPress Loop - customized with WP_Query $custom_query = new WP_Query('cat=-9');  while($custom_query->have_posts()) : $custom_query->the_post(); ... endwhile; wp_reset_postdata(); // reset the query ?>

Применяются те же параметры, что и для query_posts, поэтому для модификации числа постов, используемыхисключаемых рубрик, порядка сортировки делается все то же самое.

 $custom_query = new WP_Query('cat=-7,-8,-9'); // исключить категории $custom_query = new WP_Query('posts_per_page=3'); // ограничить количество $custom_query = new WP_Query('order=ASC'); // порядок сортировки

А также любые нужные комбинации

 $custom_query = new WP_Query('cat=-7,-8,-9&posts_per_page=3&order=ASC');

В дополнение к сферам применения, мы также можем создавать и настраивать дополнительные множественные циклы, вот типовой пример:

 <?php // Loop 1 $first_query = new WP_Query('cat=-1'); // исключили категорию 1 while($first_query->have_posts()) : $first_query->the_post(); ... endwhile; wp_reset_postdata(); // reset the query // Loop 2 $second_query = new WP_Query('cat=-2'); // исключили категорию 2 while($second_query->have_posts()) : $second_query->the_post(); ... endwhile; wp_reset_postdata(); // reset the query // Loop 3 $third_query = new WP_Query('cat=-3'); // исключили категорию 3 while($third_query->have_posts()) : $third_query->the_post(); ... endwhile; wp_reset_postdata(); // reset the query ?>

Каждый из этих циклов может быть размещен в любом месте шаблона, не нужно вписывать их последовательно. Например, первый цикл может быть в сайдбаре, второй в футере и т.д.. И каждый выводит свои собственные списки записей, в соответствии с параметрами.

При желании можно комбинировать вместе 3 разных способа query_posts , get_posts и WP_Query в множественных циклах. А в версии вордпресса 3.3 появилась функция is_main_query, позволяющая модифицировать только главные объекты в WP_Query, подробнее на https://codex.wordpress .org/Functi on_Reference/i s_main_query

Настраиваем get_posts

Самый легкий и безопасный способ создать множественные циклы, это get_posts. Просто добавляете в нужном месте шаблона

 <?php  global $post; $args = array('category' => -9); // исключили категорию $custom_posts = get_posts($args); foreach($custom_posts as $post) : setup_postdata($post); ... endforeach; ?>

Этот код создает циклы всех постов за исключением указанной рубрики. Конечно, исключение рубрик не единственный способ применения циклов. Опять же, используя различные параметры можно получить любой нужный результат.

Но есть один момент, get_posts требует передачи параметров в виде массива, т.е.

 $args = array('category'=>-7,-8,-9, 'numberposts'=>3, 'order'=>'ASC');

Также обратите внимание, что мы используем numberposts вместо posts_per_page для ограничения количества записей. В соответствии с кодексом WP параметр posts_per_page все же должен работать, но если нет — то замените его на numberposts.

Стандартный цикл, а также модифицированные с помощью query_posts и WP_Query поддерживают постраничную навигацию, используя next_posts_link и previous_posts_link, а вот get_posts не поддерживает ее, отображая статический список постов, соответствующих выбранному критерию и все.

Подытожим:

  • Чтобы модифицировать стандартный цикл, используйте query_posts()
  • Чтобы модифицировать иили создать множественные циклы, используйте WP_Query()
  • Чтобы создать статический, дополнительный цикл, используйте get_posts()

Цикл не беспокоится о разметке

Это правда. Можно использовать все, что нам в голову придет. Вот пример типового цикла, закрытого в тег <div>

 <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <div <?php post_class(); ?> id="post-<?php the_ID(); ?>"> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <p class="meta">Posted on <?php the_time('F jS, Y'); ?></p> <?php the_content('Read More'); ?> <p><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', '); ?></p> </div> <?php endwhile; ?> <div class="next-posts"><?php next_posts_link('&laquo; Older Entries') ?></div> <div class="prev-posts"><?php previous_posts_link('Newer Entries &raquo;') ?></div> <?php endif; ?>

И вот точно такой же цикл, оформленный в стиле нумерованного списка

 <?php if (have_posts()) : ?> <ol> <?php while (have_posts()) : the_post(); ?> <li <?php post_class(); ?> id="post-<?php the_ID(); ?>"> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <p class="meta">Posted on <?php the_time('F jS, Y'); ?></p> <?php the_content('Read More'); ?> <p><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', '); ?></p> </li> <?php endwhile; ?> </ol> <?php endif; ?>

А вот пример списка определений

 <?php if (have_posts()) : ?> <dl> <?php while (have_posts()) : the_post(); ?> <dt <?php post_class(); ?> id="post-<?php the_ID(); ?>"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </dt> <dd> <?php the_excerpt(); ?> </dd> <?php endwhile; ?> </dl> <?php endif; ?>

Обратите внимание, что не только разметка отличается в этих трех примерах, но и используемые функции разные. Например, в третьем случае использовался the_excerpt() для вывода цитат вместо контента.

По умолчанию the_excerpt() выводит первые 55 слов записи, если не задано поле цитата записи. Поэтому для постов длиной меньше 55 слов будет выведено полное содержание, более 55 слов – только часть.

Мораль такая — циклы WordPress очень удобная, гибкая и мощная штука — вы можете как угодно применять их и где угодно размещать.

Мощь WP_Query

Много магии осуществляется с помощью функции WP_Query, которая определенно стоит того, чтобы с ней разобраться. Как мы видели ранее, каждое выполнение цикла основано на запросе, соответствующем типу загруженной страницы, настройкам сайта и т.п.. Этот запрос по умолчанию может быть изменен и заменен с помощью WP_Query.

В большинстве случаев вы можете сохранить оригинальный запрос и модифицировать только некоторые параметры, например вот так

 <?php  $custom_query = new WP_Query('cat=10&showposts=2&paged='.$paged); while($custom_query->have_posts()) : $custom_query->the_post(); ... endwhile; next_posts_link('&laquo; Старые записи'); previous_posts_link('Новые записи &raquo;'); wp_reset_postdata(); // сбрасываем запрос ?>

Как и в предыдущих примерах, изменением параметров в новом WP_Query вы легко настраиваете вывод любого набора записей. Давайте подробно разберем наиболее типичные способы применения.

Отображение разного количества записей

Глобальная настройка количества отображаемых постов настраивается в админке, но мы можем менять это значение прямо в цикле. Например, так мы задаем свое значение вместо значения по умолчанию.

 $custom_query = new WP_Query('showposts=6&paged='.$paged);

Таким образом мы ограничим количество выводимых постов шестью, вместо десяти (значение по умолчанию). Чтобы вывести абсолютно все записи, нужно указать параметр равный «-1».

Исключаем некоторые категории

Одна из самых популярных задач – исключение записей определенной категории на главной странице сайта. Например, у вас есть несколько записей про хомячков, но вы хотели бы убрать их с главной страницы сайта. Этот контент остается в базе данных, отображается в своей рубрике и RSS ленте, но только не на главной. Есть множество способов сделать это, но мы применим самое простое из решений…да, это WP_Query class:

 $custom_query = new WP_Query('cat=-3&paged='.$paged); // нет хомячкам

В общих случаях, знак минус означает исключить данный параметр.

Поэтому мы исключили третью рубрику (про хомячков).                                                   

Другие возможности исключить содержимое этой рубрики — использовать php функцию continue и пропускать записи определенной категории, скрывать контент с помощью css и javascript, править файлы ядра вордпресс и использовать плагины. Согласитесь, WP_Query однозначно лучше.

Изменяем порядок сортировки

WordPress относится к приложениям LIFO типа — last in, first out, т.е. последний пришел, первый вышел. Что означает, что мы видим сначала свеже опубликованные записи, а старички спрятаны глубоко в недрах навигации. Это рационально, т.к. большинство блоговых сайтов стремится первым показать самый свежий контент. Это дает людям смысл периодически возвращаться на сайт, т.к. они смогут найти что-то новенькое прямо на первой странице сайта. Но это не идеальный вариант для каждого типа сайтов.

Допустим, вы используете вордпресс для того, чтобы публиковать свой роман. Это означает, что вы писали и публиковали его хронологически, главу за главой. Поэтому, когда посетители приходят на ваш сайт, вы хотите показать им сначала главу Один, но она является фактически самой старой записью, поэтому вместо этого они увидят самую последнюю опубликованную главу. Но нет проблем, всего навсего изменим порядок сортировки:

 $custom_query = new WP_Query('orderby=date&order=ASC&paged='.$paged);

Покажем специфические страницы, встраивая страницу в страницу

Другой интересный и полезный цикл, это использовать новый WP_Query class для отображения только одной определенной страницы. Это может быть полезно из разных соображений, например, для встраивания одной страницы в другую. Вот пример запроса, когда содержимое страницы About встраивается в другую страницу:

 $custom_query = new WP_Query('pagename=about&paged='.$paged);

Обратите внимание, что в pagename нужно использовать не реальное название страницы, а ее слаг.

Пример использования множественных циклов

Ничто не заставляет вас ограничиваться только одним циклом. Вы можете использовать ровно столько, сколько вам нужно. Фактически, это в целом нормально иметь множественные циклы в шаблоне. Простым примером будет главная страница, которая показывает полное содержание трех новых публикаций. А затем в сайдбаре, в втором цикле показывает выдержки из остальных семи публикаций. И все работает чудесным образом.

А вот пример более сложной реализации. Допустим, у нас есть милый четырех колоночный шаблон. В левом сайдбаре мы покажем выдержки из одной категории. Затем в главной центральной части, разбитой на две колонки, мы покажем 10 последних записей по 5 в каждой. И затем в правом сайдбаре, мы покажем еще 10 записей, идущих после первых десяти.

Таким образом у нас получается 4 цикла

1 — Левый сайдбар 2 — Левая колонка 3 — Правая колонка 4 — Правый сайдбар

new WP_Query( 'cat=7&showposts=3');

3 последние записи из рубрики номер 7

new WP_Query( 'cat=-7&showposts=5');

5 последних записей, кроме из рубрики номер 7

new WP_Query( 'cat=-7&showposts=5 &offset=5');

еще 5 последних записей, кроме из рубрики номер 7

new WP_Query( 'cat=-7&showposts=10 &offset=10');

еще 10 последних записей, кроме из рубрики номер 7

которые будут находиться в index.php, но также разместить их можно будет где угодно еще.

Теперь необходимо разобраться с используемыми параметрами, которые помогают отображать именно то, что нам нужно.

Параметр cat

  • Цикл 1 — отображает записи только из 7 рубрики (cat=7)
  • Цикл 2 — отображает записи кроме 7 рубрики (cat=-7)
  • Цикл 3 — отображает записи кроме 7 рубрики (cat=-7)
  • Цикл 4 — отображает записи кроме 7 рубрики (cat=-7)

Параметр showposts

  • Цикл 1 — отображает только 3 записи (showposts=3)
  • Цикл 2 — отображает только 5 записей (showposts=5)
  • Цикл 3 — отображает только 5 записей (showposts=5)
  • Цикл 4 — отображает только 10 записей (showposts=10)

Параметр offset

  • Цикл 1 — не используется Цикл 2 — не используется
  • Цикл 3 — пропускает первые 5 записей (offset=5)
  • Цикл 4 — пропускает первые 10 записей (offset=10)

Таким образом, каждый цикл модифицирован для отображения желаемых записей. Последнее, что останется рассмотреть, это нужна ли нам навигация в одном из этих циклов. В обычных циклах по умолчанию мы используем теги posts_nav_link() для вывода навигационных ссылок на главную, рубрики и архивы.

Для этого примера мы создадим навигацию на предыдущие и следующие записи в втором цикле. А также настроим отображение полных записей или цитат записей в нужных местах.

Цикл 1 — Левый сайдбар

 $first_query = new WP_Query('cat=7&showposts=3'); while($first_query->have_posts()) : $first_query->the_post(); the_excerpt(); endwhile; wp_reset_postdata();

Отображает 3 кратких записи.

Цикл 2 — Левая колонка

 $second_query = new WP_Query('cat=-7&showposts=5&paged='.$paged); while($second_query->have_posts()) : $second_query->the_post(); the_content(); endwhile; next_posts_link(); previous_posts_link(); wp_reset_postdata();

Отображает 5 полных записей, а после них выводит ссылки на следующие и предыдущие записи.

Цикл 3 — Правая колонка

 $third_query = new WP_Query('cat=-7&showposts=5&offset=5'); while($third_query->have_posts()) : $third_query->the_post(); the_content(); endwhile; wp_reset_postdata();

Цикл 4 — правый сайдбар

 $fourth_query = new WP_Query('cat=-7&showposts=10&offset=10'); while($fourth_query->have_posts()) : $fourth_query->the_post(); the_content(); endwhile; wp_reset_postdata();

Отображает 10 полных записей.

Понятно, что стоит добавить нужные html коды верстки и разметки для создания стиля и структурирования отображения контента, но уже этого кода почти достаточно для создания своего собственного шаблона.

iwsm.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector