如何在管理页面中使帖子变得粘滞?

时间:2014-11-04 作者:need-help

我使用使用自定义帖子类型的餐厅插件<问题是,是否可以选择一些帖子,让他在管理中保持粘性(始终在顶部)<我需要这个,因为当你在餐厅菜单上添加许多项目时,很难找到项目(帖子)。

所以我只是想通过slug从帖子类型中找到帖子,并让他在管理页面(而不是在前面)中保持粘性

我做了一些代码来找到正确的帖子,但是如何让他变得粘乎乎的呢?

        $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 个回复
最合适的回答,由SO网友:birgire 整理而成

自定义帖子类型的“管理粘滞”:要在后端支持粘滞自定义帖子,可以在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\'.

结束

相关推荐

将JS功能添加到wp-admin/post.php中的发布按钮

我在帖子中创建了一个带有新元盒的插件。php。它本身工作得很好,但问题是如果用户选择在WordPress中按“发布/更新/保存”,它将保存其值。我尝试将JQuery函数添加到#publish 项目这种方式是可行的,但它会带来一个恼人的问题:“您确定要离开此页面吗?”window.location.reload() 我不能在那里。 $(\"#publish\").click(function(e) { //e.pr