web-dev-qa-db-ja.com

フロントエンドから投稿を編集します。post_tagsは保存されますが、分離されません

私はWordpressのためのCRMテーマを構築しています。だから私はフロントエンドから投稿、編集そして投稿を削除します。私はすべての問題を解決するための良い方法を考えています。しかし1つ失敗があります。インデックスには "編集"と "削除"ボタンがあります。 「編集」をクリックするとフォームが表示されます。私はそこにpost_tagsを変えることができます。変更は保存されますが、単一の単語は分離されません。 input-fieldのすべての単語は一つの大きなタグです - サイドバーのウィジェットでそれを見ることができます。しかし、私はセパレータを使用します...あなたが2分を持っているならば:

ここで(index.phpに)私は記事を削除することができます:

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(); ?>

インデックスのループでは、次のコードを見つけることができます。最初の形式は編集用、2番目の形式は削除用です。

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

すべて大丈夫です。今すぐeditieren-formular.php、これは "Editiere Formular"と呼ばれるサイトのページテンプレートです。 "editieren-formular"はナメクジです。

<?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

さて、自分で解決策を見つけました。過去に私はpost_tagsをで保存しました

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

今私はpost_tagsを保存します

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

そしてそれはうまくいきます。この方法は同じ方法です、私はフロントエンドから新しい記事を公開するために使用します。これだけを変更し、他には何もしません。

3
wellseo

$_POST['post_tags']を挿入しようとしているときは、実際には1つの長い文字列が保持されています。あなたが '区切り'と呼んでいるのは、ここでいくつかの区切り文字を使ってすべてのタグから単一の文字列を作成することです。

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

しかし最終的な結果は単純な文字列なので、wp_set_post_termsを呼び出す前にそれを分割する必要があります - それを配列として展開すると、カンマ区切りの文字列ではなくタグを含む配列が得られます。

1
Mario Peshev