Abilitare i post in evidenza per i custom post_type
Ho questo custom post_type: tvr_apartment
function custom_post_apartment() {
$labels = array(
'name' => 'Appartamenti',
'singular_name' => 'Appartamento',
'add_new' => 'Aggiungi Nuovo',
'add_new_item' => 'Aggiungi Nuovo Appartamento',
'edit_item' => 'Modifica Appartamento',
'new_item' => 'Nuovo Appartamento',
'all_items' => 'Tutti gli Appartamenti',
'view_item' => 'Visualizza Appartamento',
'search_items' => 'Cerca Appartamenti',
'not_found' => 'Nessun appartamento trovato',
'not_found_in_trash' => 'Nessun appartamento trovato nel cestino',
'parent_item_colon' => '',
'menu_name' => 'Appartamenti'
);
$args = array(
'labels' => $labels,
'public' => true,
'query_var' => true,
'rewrite' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'taxonomies' => array('rf_apartment_feature'),
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt' )
);
register_post_type( 'tvr_apartment', $args );
}
E vorrei abilitare la funzionalità dei post in evidenza per questo custom post type,
Ho cercato qui: http://codex.wordpress.org/Function_Reference/post_type_supports
Ma sembra che non sia la strada giusta da seguire, avete qualche idea?

Secondo l'ampio e longevo ticket trac #12702, i custom post type non supportano (e probabilmente non supporteranno) la funzionalità sticky.
Probabilmente non è impossibile riutilizzarla (con una quantità sacrilega di copia-incolla e casi limite) per i CPT in un sito personalizzato, ma secondo me una soluzione personalizzata (probabilmente basata su campi personalizzati) sarebbe un approccio più pratico e pulito.

Sto utilizzando un plugin https://cs.wordpress.org/plugins/seamless-sticky-custom-post-types/

Aggiornamento 2022:
Ora puoi utilizzare il plugin menzionato nella risposta di @Ray! Testato e sembra salvare l'attributo sticky in modo nativo, quindi puoi usare ad esempio ignore_sticky_posts
Risposta Originale:
Poiché nessuno dei plugin esistenti per questo scopo supporta WP5, una soluzione semplice (ma non ottimale) è utilizzare un nuovo metabox. Nel plugin del tuo CPT:
add_meta_box('pseudosticky', 'È sticky', 'addbox', 'IL TUO SLUG DI CUSTOM POST TYPE QUI', 'normal', 'high');
function addbox($post, $metabox) {
$entered = get_post_meta($post->ID, 'pseudosticky', true);
?>
<label><input name="pseudosticky" type="checkbox"<?if($entered=="on")echo' checked="checked"';?>> È sticky</label>
<?
}
Poi nella query
'meta_query' => array(
array(
'key' => 'pseudosticky',
'value' => "on",
'compare' => '='
)
//qui possono essere aggiunte ulteriori condizioni meta come array
),

Sono riuscito a far funzionare quanto segue. Permettimi di descrivere la tecnica in modo che tu possa decidere se utilizzarla o meno.
il codice utilizza due hook, uno attivato appena prima del posizionamento dei meta box "side" e un altro immediatamente dopo la sezione "data/ora" nel meta box di pubblicazione.
il primo hook (prima) registra il tipo di post originale e poi lo cambia in "post", WordPress pensa che sia un post e imposta i campi predefiniti specifici per il tipo di post "post".
il secondo hook (dopo) reimposta il tipo di post all'originale.
Se qualcuno riscontra problemi o può identificare casi d'uso imprevisti in cui questa tecnica potrebbe fallire, per favore rispondi.
// vedi /wp-admin/edit-form-advanced.php .. da wp 2.5.0
add_action( 'submitpost_box', function() {
// nota: non è possibile usare l'azione "post_submitbox_minor_actions" (/wp-admin/includes/meta-boxes.php) perché $post_type è impostato precocemente
global $post;
if ( isset( $post->post_type ) && in_array( $post->post_type, array( 'post_type_1', 'post_type_2' ) ) ) {
echo 'before'; // debug
$post->post_type_original = $post->post_type;
$post->post_type = 'post';
}
} );
// vedi /wp-admin/includes/meta-boxes.php .. da wp 2.9.0
add_action( 'post_submitbox_misc_actions', function() {
global $post;
if ( isset( $post->post_type_original ) && in_array( $post->post_type_original, array( 'post_type_1', 'post_type_2' ) ) ) {
echo 'after'; // debug
$post->post_type = $post->post_type_original;
unset( $post->post_type_original );
}
} );
Nota: il codice sopra si occupa di aggiungere l'opzione all'interfaccia utente, ma dovrai comunque verificare e lavorare con i post sticky nei tuoi template/output .. qualcosa come il seguente (ma senza il plugin):

Per chi sta cercando, posso confermare che questo plugin funziona con la versione 5.9 di WordPress: https://wordpress.org/plugins/sticky-posts-switch/

Sono rimasto sorpreso nello scoprire che questa funzionalità non è ancora disponibile.
Speravo che almeno in WP_Query
ci fosse qualcosa come sticky_posts
dove poter passare gli ID, ma non esiste.
Quindi ho fatto così:
<?php
$args = array( 'post_type' => 'some_post_type', 'posts_per_page' => 20 , 'orderby' => 'title', 'order' => 'ASC');
$loop = new WP_Query( $args );
$sticky_posts = array( 11462 ); // qui vanno gli ID dei post che vuoi rendere sticky
// Mostra anche quelli sticky
while ( $loop->have_posts() ) : $loop->the_post();
if ( in_array($post->ID, $sticky_posts) ):
echo "Sono STICKY!";
endif;
endwhile;
while ( $loop->have_posts() ) : $loop->the_post();
if ( !in_array($post->ID, $sticky_posts) ):
echo "Non sono sticky :( ";
endif;
endwhile;
Ovviamente non è la soluzione migliore, ha diversi limiti, ma ha funzionato per la mia semplice esigenza dove dovevo fissare in cima un solo post.
Problemi/Limiti:
- Devi modificare il blocco di codice dove hai le query e aggiungere più loop.
- Non puoi ordinarli in modo personalizzato.
- Verranno mostrati solo i post nella query corrente, quindi se hai un post sticky oltre il limite di post per pagina impostato, quel post non sarà sticky, almeno su quella pagina.
