私はカスタム投稿タイプを使用するレストランのプラグインを操作します。
問題は、投稿を選択して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);
バックエンドでスティッキーなカスタム投稿をサポートするには、現在のテーマディレクトリまたはカスタムプラグインの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 );
});
これをサポートするために以下のプラグインを使用します。
<?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'
になります。