自定义帖子类型的“管理粘滞”:要在后端支持粘滞自定义帖子,可以在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 );
});
“Admin Stickies”演示插件:我们使用以下插件来支持此功能:
<?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()
作用然后我们会找到本地人sticky
表行中的CSS类。因此,我已经注释掉了过滤器的删除。
我们还可以使用post_class
筛选以添加自定义is-admin-sticky
将CSS类转换为相应的表行。
此演示可以进一步扩展以支持前端,可能使用第三个输入参数:
wpse_cpt_stickies( $cpt, $ids, $context );
在哪里
$context
可能是
\'front\'
,
\'back\'
或
\'both\'
.