Как сделать пост липким на странице администратора?


Я работаю с плагином ресторана, который использует пользовательский тип записи.
вопрос в том, можно ли выбрать какой-нибудь пост и сделать его липким (всегда быть в топе) в админке?
мне это нужно, потому что, когда вы добавляете много пунктов в меню ресторана, становится трудно найти пункты (сообщения).

Поэтому я просто ищу решение, чтобы найти сообщение из типа сообщения по слизняку и сделать его липким на странице администратора (не спереди)

Я создал код, который находит правильный пост, но как заставить его быть липким?

        $test = get_page_by_path( 'slug', $output = OBJECT, $post_type = 'post-type' );
        $test_id = $test->ID;
        $test_page = get_post($test_id);
        $test_title = apply_filters('the_title', $test_page->post_title);
Author: need-help, 2014-11-04

1 answers

"Стикеры администратора" для пользовательских типов сообщений:

Для поддержки липких пользовательских записей в бэкэнде вы можете использовать следующий фрагмент кода в вашем файле functions.php в текущем каталоге тем или в вашем пользовательском плагине:

/**
 * Set admin stickies for the 'foodmenu' custom post type 
 */
add_action( 'init', function() {
    if( function_exists( 'wpse_cpt_stickies' ) )
        wpse_cpt_stickies( $cpt = 'foodmenu', $ids = array( 53, 102, 23 ) );
});

Где вы можете настроить $cpt и $ids в соответствии с вашими потребностями.

Мы также могли бы создать пользовательское мета-поле, например, is_admin_sticky для этих сообщений cpt, связанных с администратором. Затем мы можем получить их все с помощью:

/**
 * Set admin stickies for the 'foodmenu' custom post type 
 */
add_action( 'init', function() {
    if( function_exists( 'wpse_cpt_stickies' ) )
    {
       // Fetch all sticky posts with the "is_admin_sticky=1" custom field:
       $ids = get_posts( 
           array( 
               'post_type'      => 'foodmenu', 
               'meta_key'       => 'is_admin_sticky',
               'meta_value'     => '1',
               'posts_per_page' => 5,    # <-- Modify this to your needs
           )
       ); 

    wpse_cpt_stickies( $cpt = 'foodmenu', $ids );
});

Демо-версия "Прилипалы администратора" плагин:

Для поддержки этого мы используем следующий плагин:

<?php   
/**
 * Plugin Name:   Admin Stickies for custom post types
 * Plugin URI:    http://wordpress.stackexchange.com/a/167371/26350
 * Plugin Author: birgire
 * Version:       0.0.1
 */

function wpse_cpt_stickies( $cpt, $ids )
{
    $stickies = new WPSE_CPT_Admin_Stickies;
    $stickies->init( $cpt, $ids );
}

class WPSE_CPT_Admin_Stickies
{
    private $cpt;
    private $ids;

    public function init( $cpt = 'post' , $ids = array() )
    {
        $this->cpt = $cpt;
        $this->ids = $ids;
        add_action( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
    }

    public function pre_get_posts( $q )
    {
        if( 
            is_admin() 
            && 'edit.php' === $GLOBALS['pagenow']
            && $q->is_main_query() 
            && $this->cpt === $q->get( 'post_type' )
        )
        {
            add_filter( 'post_class', array( $this, 'post_class' ), 10, 3 );    
            add_filter( 'option_sticky_posts', array( $this, 'custom_stickies' ) );
            $q->is_home = 1; # <-- We must use this "hack" to support sticky posts
            $q->set( 'ignore_sticky_posts', 0 );
        } 
    }

    public function custom_stickies( $data )
    {
        // remove_filter( current_filter(), array( $this, __FUNCTION__ ) );
        if( count( $this->ids ) > 0 )
            $data = $this->ids;

        return $data;
    }

    public function post_class( $classes, $class, $post_ID ) 
    {
        // Append the sticky CSS class to the corresponding row:
        if( in_array( $post_ID, $this->ids, true ) )
            $classes[] = 'is-admin-sticky';

        return $classes;
    }

} // end class

Прикрепленные сообщения сохраняются в опции sticky_posts, и она доступна только для обычных сообщений.

Здесь мы перехватываем фильтр option_sticky_posts, чтобы поддерживать его для пользовательских типов записей в серверной части.

Если мы не удалим наш обратный вызов фильтра option_sticky_posts после первого запуска, это также повлияет на функцию is_sticky(). Затем мы получим собственный CSS-класс sticky в строке таблицы. Поэтому я прокомментировал удаление фильтра.

Мы также можем использовать фильтр post_class, чтобы добавить наш пользовательский класс CSS is-admin-sticky в соответствующую строку таблицы.

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

wpse_cpt_stickies( $cpt, $ids, $context );

Где $context может быть 'front', 'back' или 'both'.

 6
Author: birgire, 2014-11-04 18:04:36