web-dev-qa-db-ja.com

管理ページで投稿を固定するにはどうすればいいですか?

私はカスタム投稿タイプを使用するレストランのプラグインを操作します。
問題は、投稿を選択してadminに固定すること(それが常に一番上になるようにする)が可能な場合ですか?
レストランのメニューにたくさんのアイテムを追加すると、アイテム(投稿)を見つけるのが難しくなるため、これが必要です。

だから私はただスラッグで投稿の種類から投稿を見つけるための解決策を探していて、そして彼を管理者ページで固定しています(前面ではありません)

私は正しい投稿を見つけるようなコードを作りましたが、どうして彼をスティッキーにするのですか?

        $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
need-help

カスタム投稿タイプの「管理スティッキ」:

バックエンドでスティッキーなカスタム投稿をサポートするには、現在のテーマディレクトリまたはカスタムプラグインの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を調整できます。

カスタムメタフィールドを作成することもできます。これらの管理スティッキcpt投稿のis_admin_sticky。それから、それらをすべて取得することができます。

/**
 * 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クラスを対応するテーブル行に追加することもできます。

このデモはフロントエンドをサポートするためにさらに拡張することができます。おそらく3番目の入力パラメータを使用します。

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

$context'front''back'または'both'になります。

6
birgire