difficultés avec Les Custom Post Type (Créer un compte)

  • WordPress :5.8
  • Statut : non résolu
13 sujets de 31 à 43 (sur un total de 43)
  • Auteur
    Messages
  • #2385217
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Ouaip, c’est compliqué un peu 😀

    Quelque part avant ou après the_content() (c’est la fonction qui affiche le contenu de ton éditeur)

    Là ça dépend vraiment de ce que tu veux faire. Si tu n’as que des custom fields, tu les mets à la place de the_content(). Sinon tu décides si tu les affiches avant ou après

    #2385220
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    euhhh un peu je dirais beaucoup quand même

    surtout quand on entend parler pour la première fois de ces fonctions et autres

    mon but et juste de créer un formulaire pour ensuite afficher les données et rien de plus …

    donc pour les afficher si je prends le fichier single-recette.php que j ai crée je ne vois pas de the_content().

     

    voici le fichier single-recette.php que j ai dupliqué avec  single.php

    <?php
    /**
     * The template for displaying all single posts
     *
     * @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
     *
     * @package WordPress
     * @subpackage Twenty_Nineteen
     * @since Twenty Nineteen 1.0
     */
    //script l’appel au fichier header.php 
    get_header();
    //Ensuite, nous avons deux éléments structurants imbriqués primary et main
    ?>
    
    	<div id="primary" class="content-area">
    		<main id="main" class="site-main">
    
    			<?php
    
    			// debut boucle.affiche l’article avec le template-part
    			while ( have_posts() ) :
    				the_post();
    
    				get_template_part( 'template-parts/content/content', 'single' );
    
    				if ( is_singular( 'attachment' ) ) {
    					// Navigation dans les publications des parents
    					the_post_navigation(
    						array(
    							/* translators: %s: Parent post link. */
    							'prev_text' => sprintf( __( '<span class="meta-nav">Published in</span><span class="post-title">%s</span>', 'twentynineteen' ), '%title' ),
    						)
    					);
    				} elseif ( is_singular( 'post' ) ) {
    					// cela permet de voyager d article en article.
    					the_post_navigation(
    						array(
    							'next_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Next Post', 'twentynineteen' ) . '</span> ' .
    								'<span class="screen-reader-text">' . __( 'Next post:', 'twentynineteen' ) . '</span> <br/>' .
    								'<span class="post-title">%title</span>',
    							'prev_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Previous Post', 'twentynineteen' ) . '</span> ' .
    								'<span class="screen-reader-text">' . __( 'Previous post:', 'twentynineteen' ) . '</span> <br/>' .
    								'<span class="post-title">%title</span>',
    						)
    					);
    				}
    
    				// Si les commentaires sont ouverts ou si nous avons au moins un commentaire, chargez le modèle de commentaire.
    				if ( comments_open() || get_comments_number() ) {
    					comments_template();
    				}
    
    			endwhile; // fin de la boucle 
    			?>
    
    		</main><!-- #main -->
    	</div><!-- #primary -->
    
    <?php
    get_footer();

    si je comprends bien je dois remplacer cette partie  par l affichage des  Custom Fields

    // debut boucle.affiche l’article avec le template-part
    			while ( have_posts() ) :
    				the_post();
    
    				get_template_part( 'template-parts/content/content', 'single' );
    
    				if ( is_singular( 'attachment' ) ) {
    					// Navigation dans les publications des parents
    					the_post_navigation(
    						array(
    							/* translators: %s: Parent post link. */
    							'prev_text' => sprintf( __( '<span class="meta-nav">Published in</span><span class="post-title">%s</span>', 'twentynineteen' ), '%title' ),
    						)
    					);
    				} elseif ( is_singular( 'post' ) ) {
    					// cela permet de voyager d article en article.
    					the_post_navigation(
    						array(
    							'next_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Next Post', 'twentynineteen' ) . '</span> ' .
    								'<span class="screen-reader-text">' . __( 'Next post:', 'twentynineteen' ) . '</span> <br/>' .
    								'<span class="post-title">%title</span>',
    							'prev_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Previous Post', 'twentynineteen' ) . '</span> ' .
    								'<span class="screen-reader-text">' . __( 'Previous post:', 'twentynineteen' ) . '</span> <br/>' .
    								'<span class="post-title">%title</span>',
    						)
    					);
    				}

    #2385221
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    en php pur cela est simple

    on doit juste créer un formulaire et on envois les donnes en base de donnée

    et ensuite on les affiche la ou on veux  …

    avec insert et select

    mais ici avec ces fonctions …

    • Cette réponse a été modifiée le il y a 21 heures et 1 minute par flexi2202.
    #2385226
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Non tu n’as pas bien compris 🙂 (a ta décharge, 2019 est complexe)

    Je t’ai dit “the_content” est ce que tu as vu cette fonction php ?
    Elle est cachée dans

    get_template_part( 'template-parts/content/content', 'single' );

    Donc pour faire simple, dans ton single-recette.php

    tu remplaces cette ligne par le “contenu” du fichier en question, dans lequel tu vas surement trouver à un moment ou à un autre the_content().

    <code class=” code-embed-code language-php”>

    #2385238
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    je suis désolé de mettre autant de temps a comprendre

    mais merci pour la patience

    il y a ceci que je n ai pas encore compris

    tu remplaces cette ligne par le “contenu” du fichier en question, dans lequel tu vas surement trouver à un moment ou à un autre the_content().

    mais de quel fichier ?  de celui ci …

    car the_content(). c est le contenu

    <div class="meta">
    
                    <?php if( get_field('Ingredients') ): ?>
                    <p> <span class="glyphicon glyphicon-list-alt"></span> <strong>Ingredients</strong> :<?php the_field('Ingredients'); ?></p>
                <?php endif; ?>
    
    
                <?php if( get_field('Preparation') ): ?>
                <p> <span class="glyphicon glyphicon-list-alt"></span> <strong>Preparation</strong> :<?php the_field('Preparation'); ?></p>
            <?php endif; ?>
    
            <?php if( get_field('Cuisson') ): ?>
            <p><span class="glyphicon glyphicon-fire"></span> <strong>Cuisson</strong>:<?php the_field('Cuisson'); ?></p>
        <?php endif; ?>
    
        <?php if( get_field('Difficulté') ): ?>
        <p> <span class="glyphicon glyphicon-signal"></span> <strong>Difficulte</strong>:<?php the_field('Difficulté'); ?></p>
    <?php endif; ?>
    
    <?php if( get_field('Temps') ): ?>
        <p><span class="glyphicon glyphicon-time"></span><strong>Temps</strong>:<?php the_field('Temps'); ?></p>
    <?php endif; ?>
    
    </div>

     

     

    #2385243
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    the_content() c’est la fonction de WordPress qui appelle le contenu du post (champ post_content dans la table wp_posts).
    Toutes les autres lignes que tu as copiées sont des appels à la table wp_postmeta (donc aux champs personnalisés), pour les afficher.

    #2385244
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    un grand merci pour cette aide et la patience

    je pense avoir compris

    donc le code pour le fichier single-recette.php

    serait le suivant

    <?php
    /**
     * The template for displaying all single posts
     *
     * @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
     *
     * @package WordPress
     * @subpackage Twenty_Nineteen
     * @since Twenty Nineteen 1.0
     */
    //script l’appel au fichier header.php 
    get_header();
    //Ensuite, nous avons deux éléments structurants imbriqués primary et main
    ?>
    
    	<div id="primary" class="content-area">
    		<main id="main" class="site-main">
    
    			<?php
    
    			// debut boucle.affiche l’article avec le template-part
    			while ( have_posts() ) :
    				the_post();?>
    				<?php // debut partie que je remplace ?>
    				      <h1 class="site__heading"><?php the_title(); ?></h1>
          <div class="wp-content"><?php the_content(); ?></div>
    
             <div class="meta">
    
                    <?php if( get_field('Ingredients') ): ?>
                    <p> </span> <strong>Ingredients</strong> :<?php the_field('Ingredients'); ?></p>
                <?php endif; ?>
    
    
                <?php if( get_field('Preparation') ): ?>
                <p> </span> <strong>Preparation</strong> :<?php the_field('Preparation'); ?></p>
            <?php endif; ?>
    
            <?php if( get_field('Cuisson') ): ?>
            <p><strong>Cuisson</strong>:<?php the_field('Cuisson'); ?></p>
        <?php endif; ?>
    
        <?php if( get_field('Difficulté') ): ?>
        <p> </span> <strong>Difficulte</strong>:<?php the_field('Difficulté'); ?></p>
    <?php endif; ?>
    
    <?php if( get_field('Temps') ): ?>
        <p></span><strong>Temps</strong>:<?php the_field('Temps'); ?></p>
    <?php endif; ?>
    
    </div>
    <?php // fin partie que je remplace ?>
      <?php 
        if( current_user_can( 'publish_posts' ) ) { // Contrôle des rôles utilisateur
          	acf_form(); // Le formulaire ACF
        }
      ?>
    
    				
    <?php
    				if ( is_singular( 'attachment' ) ) {
    					// Navigation dans les publications des parents
    					the_post_navigation(
    						array(
    							/* translators: %s: Parent post link. */
    							'prev_text' => sprintf( __( '<span class="meta-nav">Published in</span><span class="post-title">%s</span>', 'twentynineteen' ), '%title' ),
    						)
    					);
    				} elseif ( is_singular( 'post' ) ) {
    					// cela permet de voyager d article en article.
    					the_post_navigation(
    						array(
    							'next_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Next Post', 'twentynineteen' ) . '</span> ' .
    								'<span class="screen-reader-text">' . __( 'Next post:', 'twentynineteen' ) . '</span> <br/>' .
    								'<span class="post-title">%title</span>',
    							'prev_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Previous Post', 'twentynineteen' ) . '</span> ' .
    								'<span class="screen-reader-text">' . __( 'Previous post:', 'twentynineteen' ) . '</span> <br/>' .
    								'<span class="post-title">%title</span>',
    						)
    					);
    				}
    
    				// Si les commentaires sont ouverts ou si nous avons au moins un commentaire, chargez le modèle de commentaire.
    				if ( comments_open() || get_comments_number() ) {
    					comments_template();
    				}
    
    			endwhile; // fin de la boucle 
    			?>
    
    		</main><!-- #main -->
    	</div><!-- #primary -->
    
    <?php
    get_footer();

    #2385249
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Oui c’est ça. A affiner après en fonction de ce que tu souhaites, bien sûr, mais c’est le principe

     

    Champagne ^^

    #2385250
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    ah super merci

    oui en effet c est la première coupe de champagne mdrrr

    donc a présent la partie 2

    2- créer un formulaire (functions.php, je te conseille à terme de faire un plugin et de ne pas le mettre dans le thème directement, mais c’est pas urgent)

    comment et par ou je commence par réaliser cet exploit

    ca sera la deuxième verre de champagne

    #2385251
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    es ce que ceci pourrait faire l affaire

    Dans le dossier de mon thème, je crée donc une nouvelle page que j’appelle usersubmit.php

    Voici le code en entier de la page : acf_form_head() va nous permettre d’enregistrer et d’envoyer nos données saisies en base. acf_form($options) va afficher le formulaire

    En option j’indique que c’est pour créer un « new » post, je spécifie le groupe de champ concerné en ciblant son ID (que je retrouve en survolant avec la souris le nom du groupe de champ dans l’onglet custom fields), je précise le type de post : « draft » pour brouillon ou « pending » pour les laisser en attente de modération dans le backoffice. Ici je place mes différents champs que l’utilisateur devra remplir, et je peux supprimer la fonction « the_content() » devenue inutile.

     

    <?php /*Template Name: User Submit*/;?>
    <?php acf_form_head(); ?>
    <?php get_header(); ?>
    
    	<div id="container" >
    
        <div class="row">
        	<div class="col-sm-12">
    
    			<?php /* The loop */ ?>
    			<?php while ( have_posts() ) : the_post(); ?>
    				
    				<h1><?php the_title(); ?></h1>
    				<!-- a supprimer si on enlève l'éditeur par défaut -->
    				<?php the_content(); ?>
    				<!------------>
    				<p> <?php the_field('Ingredients'); ?></p>
    				<p> <?php the_field('Preparation'); ?></p>
    				<p> <?php the_field('Cuisson'); ?></p>
    				<p> <?php the_field('Temps'); ?></p>
    				<p> <?php the_field('Difficulté'); ?></p>
    				<?php  $options = array('post_id'		=> 'new',
    		'field_groups' => array(735),
    		'post_title'	=> true,
    		
    	
    			'post_type'		=> 'post',
    			'post_status'	=> 'draft',
    		
    		'updated_message'    => 'Merci pour votre participation!Votre recette sera publiée prochainement',
    		'submit_value'	=> 'Postez votre recette'
    		);
    				 acf_form($options);?>
    
    			<?php endwhile; ?>
    </div>
    		</div><!-- #content -->
    	</div><!-- #primary -->
    
    <?php get_footer(); ?>

    #2385254
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Oui c’est ça.

    On ne se comprenait pas, les explications que je te donnais étaient pour l’étape suivante (affichage “post par post créé” des données enregistrées) que tu feras maintenant les doigts dans le nez.

    #2385255
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    c est pas simple lorsque on n y connaît rien du tout de s y retrouver

    je ne fais que du copier coller du tuto

    d après le tuto que je lis

    voici l étape suivante
    <h3>L’enregistrement des données</h3>
    Dans notre fichier functions.php, on va donc rajouter un filtre (add_filter(‘acf/pre_save_post’… ) pour enregistrer le tout, et faire en sorte que le champs titre devienne par défaut le titre de ma nouvelle recette.

     

    function my_pre_save_post( $post_id ) {
     
        // check if this is to be a new post
        if( $post_id != 'new' )
        {
            return $post_id;
        }
     
        // Create a new post
        $post = array(
            'post_status'  => 'pending',
            'post_title'    => $_POST['fields']['field_58416c03647e0'],
            'post_type'  => 'post',
        );
     
        // insert the post
        $post_id = wp_insert_post( $post );
     
        // update $_POST['return']
        $_POST['return'] = add_query_arg( array('post_id' => $post_id), $_POST['return'] );
     
        // return the new ID
        return $post_id;
    }
     
    add_filter('acf/pre_save_post' , 'my_pre_save_post' );

    Ici pour enregistrer mon titre en tant que « post_title », je cible la meta key de mon champ titre  ‘post_title’    => $_POST[‘fields’][‘field_58416c03647e0’].
    Dans la version pro, le code est différent.($_POST[‘acf’][‘field_58416c03647e0’] )

    Pour info: Je peux retrouver l’id de chacun de mes champ, dans l’onglet custom field  du backoffice, en déroulant l’ »option screen » dans la page de mon groupe de champ et en cochant la case »Show Field key »–>Yes

    acf12

    Maintenant, le texte renseigné en front, dans le champ « titre », apparaît bien comme titre du nouvel article en backoffice. C’est donc l’utilisateur lui même qui indique le titre de sa recette!

    #2385290
    flexi2202
    Participant
    Padawan WordPress
    67 contributions

    ah mince cela paraissait trop vrai pour être beau
    j ai un soucis avec le formulaire les différents champs ne s affichent pas

    pourtant tout est bon
    voici les champs de acf
    et voici le formulaire

    dans ma barre de navigation j ai le bon fichier

    <?php /*Template Name: User Submit*/;?>
    <?php acf_form_head(); ?>
    <?php get_header(); ?>
    
    	<div id="container" >
    
        <div class="row">
        	<div class="col-sm-12">
    
    			<?php /* The loop */ ?>
    			<?php while ( have_posts() ) : the_post(); ?>
    				
    				<h1><?php the_title(); ?></h1>
    				<!-- a supprimer si on enlève l'éditeur par défaut -->
    				<?php the_content(); ?>
    				<!------------>
    				<p> <?php the_field('Ingredients'); ?></p>
    				<p> <?php the_field('Preparation'); ?></p>
    				<p> <?php the_field('Cuisson'); ?></p>
    				<p> <?php the_field('Temps'); ?></p>
    				<p> <?php the_field('Difficulté'); ?></p>
    				<?php  $options = array('post_id'		=> 'new',
    		'field_groups' => array(735),
    		'post_title'	=> true,
    		
    	
    			'post_type'		=> 'post',
    			'post_status'	=> 'draft',
    		
    		'updated_message'    => 'Merci pour votre participation!Votre recette sera publiée prochainement',
    		'submit_value'	=> 'Postez votre recette'
    		);
    				 acf_form($options);?>
    
    			<?php endwhile; ?>
    </div>
    		</div><!-- #content -->
    	</div><!-- #primary -->
    
    <?php get_footer(); ?>

    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
13 sujets de 31 à 43 (sur un total de 43)
  • Vous devez être connecté pour répondre à ce sujet.