Une seule page de type de message personnalisé renvoie une erreur 404

17

J'ai un type de message personnalisé appelé slide. Il a du contenu et des champs personnalisés. Je veux que WP affiche le single.phpthème ou le single-slide.phpthème lorsque l'utilisateur clique sur le lien d'une page de diapositive. le problème que j'ai est que WP jette une erreur 404, quand je veux voir la page de diapositive unique.

voici mon code en functions.php:

function create_slide_post_type() {
    $labels = array(
        'name'               => _x( 'اسلایدها', 'i2sa' ),
        'singular_name'      => _x( 'اسلاید', 'i2sa' ),
        'menu_name'          => _x( 'اسلایدها', 'i2sa' ),
        'name_admin_bar'     => _x( 'اسلاید', 'i2sa' ),
        'add_new'            => _x( 'افزودن', 'i2sa' ),
        'add_new_item'       => __( 'افزودن اسلاید جدید', 'i2sa' ),
        'new_item'           => __( 'اسلاید جدید', 'i2sa' ),
        'edit_item'          => __( 'ویرایش اسلاید', 'i2sa' ),
        'view_item'          => __( 'نمایش اسلاید', 'i2sa' ),
        'all_items'          => __( 'همه اسلایدها', 'i2sa' ),
        'search_items'       => __( 'جستجوی اسلایدها', 'i2sa' ),
        'parent_item_colon'  => __( 'اسلایدهای مادر:', 'i2sa' ),
        'not_found'          => __( 'اسلایدی پیدا نشد.', 'i2sa' ),
        'not_found_in_trash' => __( 'اسلایدی در زباله دان پیدا نشد.', 'i2sa' )
    );

    $args = array(
        'labels'             => $labels,
        'description'        => "اسلایدهای شرکت i2sa",
        'public'             => true,
        'exclude_from_search'=> true,
        'publicly_queryable' => false,
        'show_in_nav_menus'  => false,
        'menu_icon'          => 'dashicons-images-alt2',
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array( 'slug' => 'slide' ),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => null,
        'supports'           => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
    );
    register_post_type( 'slide', $args );
    flush_rewrite_rules();
}
add_action( 'init', 'create_slide_post_type' );
Ramin
la source

Réponses:

41

Vous devez définir votre publicly_queryableargument truelors de l'enregistrement de votre type de publication personnalisé.

PRENEZ NOTE : Ajoutez flush_rewrite_rules(), actualisez la page une ou deux fois et RETIREZ-LA IMMÉDIATEMENT. Vous NE DEVEZ PAS conserver flush_rewrite_rules()sauf en vertu des dispositions du Codex.

c'est une opération coûteuse, elle ne doit donc être utilisée qu'en cas d'absolue nécessité

Pieter Goosen
la source
1
Oh wow, ça a fonctionné ici aussi. Ce n'était absolument pas évident. Je vous remercie!
Toby Deshane
A travaillé pour moi! Merci!
JamesHoux
Oui! Enfin, après avoir fait les deux, cela a fonctionné.
Eric
16

Rincez la règle de réécriture à partir du tableau de bord -> Paramètres -> Page Lien permanent. Cliquez sur le bouton Enregistrer, puis vérifiez la page des détails de votre diapositive. Cela fonctionnera maintenant. Sinon, vous pouvez écrire ce code flush_rewrite_rules()dans votre create_slide_post_type()fonction. Voir le Codex

Chinmoy Kumar Paul
la source
2
Cliquer sur le bouton Enregistrer dans Permlinks a fonctionné pour moi. Après avoir déplacé le site vers un serveur de production, tous les liens de type de publication personnalisés se brisaient. Cela l'a corrigé. Merci!
cbloss793
+1 Un simple clic sur Enregistrer dans Permaliens a également fonctionné pour moi.
MarsAndBack
La sauvegarde des permaliens fonctionne. Mais veuillez ne pas ajouter flush_rewrite_rules()après les register_post_type()appels dans le code de production (c'est-à-dire à l'intérieur create_slide_post_type). Utilisez le crochet d'activation du plug-in ou une valeur d'option pour déterminer que vous avez ajouté un nouveau type de message
Philipp
6

Rafraîchissez vos permaliens. Allez dans Admin-> Paramètres-> Permaliens et appuyez sur Enregistrer. Il rafraîchit vos permaliens et devrait vous aider, surtout si vous changez de réécriture ('rewrite' => array ('slug' => 'slide'),)

Ales
la source
1

Vous devez définir les éléments suivants dans votre apache virtualhost:

    <Directory /var/www/html/wordpress>
            AllowOverride All
    </Directory>

Ensuite, actualisez vos permaliens: wp-admin-> settings-> permalinks. Cela a fonctionné pour moi.

Gustavo
la source