je travaille avec un plugin de restaurant utilisant un type de message personnalisé.
La question est de savoir s’il est possible de sélectionner un message et de le rendre collant (toujours en haut) dans l’administrateur?
J'en ai besoin, car lorsque vous ajoutez de nombreux éléments au menu du restaurant, il devient difficile de les trouver (messages).
donc je cherche juste une solution pour trouver un post de type post par slug, et le rend collant dans la page d'administration (pas à l'avant)
j'ai créé un code qui trouve le bon post, mais comment le rendre collant?
$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);
Pour prendre en charge les publications personnalisées persistantes dans le backend, vous pouvez utiliser le fragment de code suivant dans votre fichier functions.php
du répertoire du thème actuel ou dans votre plug-in personnalisé:
/**
* 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 ) );
});
où vous pouvez ajuster le $cpt
et le $ids
à vos besoins.
Nous pourrions également créer un méta-champ personnalisé, par exemple. is_admin_sticky
pour ces messages cpt admin collants. Ensuite, nous pouvons tous les récupérer avec:
/**
* 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 );
});
Nous utilisons le plugin suivant pour supporter ceci:
<?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
Les post-it sont enregistrés dans l’option sticky_posts
et elle n’est disponible que pour les posts normaux.
Ici, nous détournons le filtre option_sticky_posts
afin de le prendre en charge pour les types de publication personnalisés dans le back-end.
Si nous ne supprimons pas notre rappel de filtre option_sticky_posts
, après la première exécution, la fonction is_sticky()
sera également affectée. Nous obtiendrons ensuite la classe CSS sticky
native dans la ligne du tableau. Par conséquent, j'ai commenté la suppression du filtre.
Nous pouvons également utiliser le filtre post_class
pour ajouter notre classe CSS is-admin-sticky
personnalisée à la ligne du tableau correspondante.
Cette démo pourrait être étendue pour prendre en charge le front-end, éventuellement avec le troisième paramètre d'entrée:
wpse_cpt_stickies( $cpt, $ids, $context );
où $context
pourrait être 'front'
, 'back'
ou 'both'
.