Abilitare i post in evidenza per i custom post_type

21 lug 2013, 15:05:24
Visualizzazioni: 33.3K
Voti: 9

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,

Schermata della funzionalità post in evidenza in WordPress

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?

1
Commenti

Ho pubblicato una soluzione funzionante per WordPress 4.2 qui: http://wordpress.stackexchange.com/questions/90958/adding-sticky-functionality-to-custom-post-type-archives/185915#185915 In sostanza, implica l'installazione di un piccolo plugin e l'aggiunta di uno snippet di codice.

Tristan CHARBONNIER Tristan CHARBONNIER
30 apr 2015 08:25:17
Tutte le risposte alla domanda 5
3
11

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.

21 lug 2013 21:24:33
Commenti

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

Fanky Fanky
28 ott 2018 15:26:15

Ah, il plugin menzionato non funziona con wp5 :/

Fanky Fanky
27 set 2019 13:43:25

Le decisioni degli sviluppatori di wp sono insensate.

Michael Rogers Michael Rogers
29 apr 2020 17:16:14
0

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
  ),
27 set 2019 14:42:21
0

Sono riuscito a far funzionare quanto segue. Permettimi di descrivere la tecnica in modo che tu possa decidere se utilizzarla o meno.

  1. 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.

  2. 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".

  3. 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):

https://wordpress.stackexchange.com/a/185915/466

18 gen 2016 01:20:55
0

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

20 feb 2022 08:01:27
0

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.
14 feb 2022 19:25:24