web-dev-qa-db-fra.com

Modifier un post de frontend. post_tags est enregistré, mais pas séparé

Je construis un thème CRM pour Wordpress. Donc, je poste, édite et supprime les messages du Frontend. Je pense que je suis sur un bon moyen de résoudre tous les problèmes. Mais il y a un échec. À l'index, il y a un bouton "éditer" et "supprimer". Si je clique sur "modifier", j'arrive à un formulaire. Je peux changer les post_tags ici. Les modifications seront enregistrées, mais les mots simples ne seront pas séparés. Tous les mots du champ de saisie constituent une énorme balise - je peux la voir dans un widget situé dans la barre latérale. Mais j'utilise des séparateurs ... Si vous avez 2 minutes:

Ici (dans le fichier index.php), j’autorise la suppression d’un message:

if( 'POST' == $_SERVER['REQUEST_METHOD'] ) {
   set_query_var( 'postid1', $_POST['postid'] );     /*  set the "postid" value from the delete button of the post we choose to delete into "postid1" */
   wp_delete_post( get_query_var( 'postid1'), true );  /* delete the post we choosed */
};
get_header(); ?>

Dans la boucle de l'index, vous pouvez trouver l'extrait suivant. Le premier formulaire est à éditer, le second formulaire à supprimer:

<form class="edit" action="<?php echo esc_url( home_url( '/' ) ); ?>editieren-formular/" method="post">
    <input type="hidden" name="postid" value="<?php the_ID(); ?>" /> <?php /* get the post ID into "postid" and later pass it to "editieren-formular.php" */ ?>
    <input type="submit" value="Edit" />
</form>
<form class="delete" action="" method="post">
    <input type="hidden" name="postid" value="<?php the_ID(); ?>" /> <?php /* get the post ID into "postid" and later delete the post */ ?>
    <input type="submit"  value="Delete" />
</form>

Tout va bien. Maintenant, le fichier editieren-formular.php, qui est un modèle de page pour un site, s'appelle "Editiere Formular". "editieren-formular" est la limace.

<?php
/*
Template Name: Editieren Formular
*/

if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) &&  $_POST['action'] == "edit_post" && isset($_POST['postid'])) {
    $post_to_edit = array();
    $post_to_edit = get_post($_POST['postid']);

    /* these are the fields that we are editing in the form below. */
    $title = $_POST['title'];
    $description = $_POST['description'];
    $vorname = $_POST['vorname'];
    $name = $_POST['name'];

    /* this code will save the title and description into the post_to_edit array */
    $post_to_edit->post_title = $title;
    $post_to_edit->post_content = $description;

    /* honestly i can't really remember why i added this code but it is a must */
    $pid = wp_update_post($post_to_edit);

    /* save taxonomies: post ID, form name, taxonomy name, if it appends(true) or rewrite(false) */
    wp_set_post_terms($pid, array($_POST['cat']),'firmen',false);
    wp_set_post_terms($pid, array($_POST['post_tags']),'post_tag',false);

    //UPDATE CUSTOM FIELDS WITH THE NEW INFO
    //CHANGE TO YOUR CUSTOM FIELDS AND ADD AS MANY AS YOU NEED

    update_post_meta($pid, 'vorname', $vorname);
    update_post_meta($pid, 'name', $name);

    //REDIRECT USER WHERE EVER YOU WANT AFTER DONE EDITING
    wp_redirect( 'http://crm-wordpress-theme.wellseo.de' );

...

} // END THE IF STATEMENT THAT STARTED THE WHOLE FORM


get_header(); 

$post_to_edit = get_post($_POST['postid']); 
$terms = get_the_terms($post_to_edit->ID, 'firmen'); 
$tags = strip_tags( get_the_term_list( $post_to_edit->ID, 'post_tag', '', ', ', '' ) ); 

<?php $term_name = strip_tags( get_the_term_list( $post_to_edit->ID, 'category', '', ', ', '' ) ); ?> <!-- get the category name of this post -->
<?php $term_obj = get_term_by('name', $term_name, 'category'); ?> <!-- get the current term object -->
<?php $term_id = $term_obj->term_id ;?> <!-- get this post's term id -->
<?php $args = array(
    'selected' => $term_id,
    'name' => 'cat',
    'class' => 'postform',
    'tab_index' => 10,
    'depth' => 2,
    'hierarchical' => 1,
    'hide_empty' => false );  /* array for wp_dropdown_category to display with the current post category selected by default */ ?>

<div id="content" role="main">

<form id="edit_post" name="edit_post" method="post" action="" enctype="multipart/form-data">
    <fieldset name="title">
        <label for="title">Title:</label><br />
        <input type="text" id="title" value="<?php echo $post_to_edit->post_title; ?>" tabindex="5" name="title" />
    </fieldset>

    <fieldset id="category">
        <label for="cat" ><?php wp_dropdown_categories( $args ); ?></label>
    </fieldset>

    <fieldset class="content">
        <label for="description">Discount Description:</label><br />
        <textarea id="description"  tabindex="15" name="description"><?php echo $post_to_edit->post_content; ?></textarea>
    </fieldset>

<!-- BELOW ARE THE CUSTOM FIELDS -->

    <fieldset class="vorname">
        <label for="vorname">Vorname:</label><br />
        <input type="text" value="<?php echo get_post_meta($post_to_edit->ID,'vorname', true); ?>" id="vorname" tabindex="20" name="vorname" />
    </fieldset>

    <fieldset class="name">
        <label for="name">Name:</label><br />
        <input type="text" value="<?php echo get_post_meta($post_to_edit->ID,'name', true); ?>" id="name" tabindex="20" name="name" />
    </fieldset>

    <fieldset class="tags">
        <label for="post_tags">Additional Keywords (comma separated):</label><br />
        <input type="text" value="<?php echo $tags; ?>" tabindex="35" name="post_tags" id="post_tags" />
    </fieldset>

    <fieldset class="submit">
        <input type="submit" value="Speichern" tabindex="40" id="submit" name="submit" />
    </fieldset>
    <input type="hidden" name="postid" value="<?php echo $post_to_edit->ID; ?>" />
    <input type="hidden" name="action" value="edit_post" />
    <input type="hidden" name="change_cat" value="" />
    <?php // wp_nonce_field( 'new-post' ); ?>
</form>
</div><!-- #content -->

<?php get_sidebar(); ?>
<?php get_sidebar('two'); ?>
<?php get_footer(); ?>
3
wellseo

Ok, j'ai trouvé une solution par moi-même. Dans le passé, j'ai enregistré post_tags avec

wp_set_post_terms($pid, array($_POST['post_tags']),'post_tag',false);

Maintenant, je sauvegarde les post_tags avec

wp_set_post_tags($pid, $_POST['post_tags']);

et il fonctionne. Cette méthode est la même, j’utilise pour publier un nouveau message à partir de l’intérieur. Changé seulement cela, rien d'autre.

3
wellseo

Lorsque vous essayez d'insérer $_POST['post_tags'], il persiste une longue chaîne. Ce que vous appelez "séparer" ne fait que créer une seule chaîne parmi toutes les balises avec quelques séparateurs ici:

$tags = strip_tags( get_the_term_list( $post_to_edit->ID, 'post_tag', '', ', ', '' ) ); 

Le résultat final est cependant une simple chaîne, vous devez donc la scinder avant d'appeler wp_set_post_terms - faites-la exploser sous forme de tableau, puis vous obtiendrez un tableau avec les balises au lieu d'une chaîne séparée par des virgules.

1
Mario Peshev