WordPress как на ладони
wordpress jino

Как исключить указанные записи (посты) из вывода на главной странице

Поискал готовые, но они то с чрезмерным функционалом, то делают это массово.

Хочется с индивидуальным подходом, чтобы при публикации/редактировании поставил галочку "Не выводить на главной странице" и всё.

По аналогии, можно также указать записи именно которые нужно выводить где-то, в данном случае на главной. Для этого можно «прилеплять записи», но мне нужно альтернативное решение...

1
campusboy1946 1.1 года назад
  • 1
    Kama4660

    Держи код плагина, можно сунуть в functions.php темы...

    <?php
    
    /*
    Plugin Name: Exclude Posts Front Page
    Description: Позволяет исключить вывод помеченных постов с главной страницы сайта. Пометка ставиться при публикации/редактировании поста.
    Author: Campusboy
    Author URI: http://wp-plus.ru/
    Version: 2.2
    */
    
    // если для главной не установлена отдельная страница
    // или она есть и есть страница блога, тогда функционал переходит на страницу блога...
    if( ! get_option('page_on_front') || get_option('page_for_posts') ){
    
    	// чекбокс для исключения
    	add_action('post_submitbox_misc_actions', 'epfp_fields_box_func');
    
    	// включаем обновление полей при сохранении
    	add_action('save_post', 'epfp_fields_update', 0);
    
    	// Исключает вывод постов из списка "помеченных"
    	add_action('pre_get_posts', 'epfp_exclude_posts');
    
    	## Выводит виджет с настройками при публикации/редактировании поста
    	function epfp_fields_box_func( $post ){
    		if( $post->post_type !== 'post' ) return;
    
    		$exclude = get_post_meta( $post->ID, 'epfp_exclude_post', 1);
    
    		echo '
    		<div class="misc-pub-section">
    			<input type="hidden" name="epfp[epfp_exclude_post]" value="" />
    			<label><input type="checkbox" name="epfp[epfp_exclude_post]" value="1" '. checked( 1, $exclude, 0 ) .' /> не показывать пост на главной?</label>
    		</div>
    		';
    	 }
    
    	## Сохранение данных виджет
    	function epfp_fields_update( $post_id ){
    		if( !isset($_POST['epfp']) || ! is_admin() || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post_'. $post_id ) )
    			return false; // базовая проверка не пройдена
    
    		if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
    			return false; // автосохранение
    
    		if ( ! current_user_can('edit_post', $post_id) )
    			return false; // юзер не имеет право редактировать запись
    
    		// Все ОК! Теперь, нужно сохранить/удалить данные
    		$epfp = array_map('trim', $_POST['epfp']);
    
    		foreach( $epfp as $key => $value ){
    			if( empty($value) ){
    				delete_post_meta( $post_id, $key ); // удаляем поле если значение пустое
    				continue;
    			}
    
    			update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически
    		}
    
    		return $post_id;
    	}
    
    	## Исключает вывод постов из списка "помеченных"
    	function epfp_exclude_posts( $query ) {
    		if( $query->is_page )                                return; // когда для главной установлена страница...
    		if( ! $query->is_main_query() )                      return; // не главный запрос
    		if( ! $query->is_home && ! $query->is_front_page() ) return; // не страницы постов
    
    		$query->set(
    			'meta_query', array([ 'key'=>'epfp_exclude_post', 'compare'=>'NOT EXISTS' ])
    		);
    
    	}
    
    }
    

    В результате получим такую галку в блоке публикации поста:

    Если галка стоит, то указанный пост будет исключен из записей на главной странице сайта.

    Если для главной страницы сайта установлена отдельная страница и есть еще отдельная страница для постов блога, то функционал переходит на страницу с постами блога.

    campusboy 1.1 года назад

    Спасибо, то что нужно!

    zhora 1.1 года назад

    Из комментариев в вопросы smile, спасибо.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.