Как сделать пост липким на странице администратора?
Я работаю с плагином ресторана, который использует пользовательский тип записи.
вопрос в том, можно ли выбрать какой-нибудь пост и сделать его липким (всегда быть в топе) в админке?
мне это нужно, потому что, когда вы добавляете много пунктов в меню ресторана, становится трудно найти пункты (сообщения).
Поэтому я просто ищу решение, чтобы найти сообщение из типа сообщения по слизняку и сделать его липким на странице администратора (не спереди)
Я создал код, который находит правильный пост, но как заставить его быть липким?
$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);
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'
.