【问题标题】:Field data not showing on front end after submit提交后字段数据未显示在前端
【发布时间】:2019-10-04 14:37:50
【问题描述】:

我正在提交更新 Wordpress ACF field data using the update_field function 的表单。这很好用,但我遇到的问题是数据已提交,它会将其添加到 Wordpress 中正确的 ACF 字段,但我随后手动刷新页面以查看前端的新数据。

如何提交数据然后在第一次重新加载时显示?

<form action="#" class="forum-post-comment-form" id="forum-comment-<?php echo $counter; ?>" method="get">
  <input type="text" placeholder="Type your answer here" class="forum-comment-box" id="forum-comment-<?php echo $counter; ?>" name="forum-comment-<?php echo $counter; ?>">
    <span><input type="submit" class="comment-submit-btn" name="submit-<?php echo $counter; ?>" value=""></span>
  </input>
</form>

<?php
$value = array();
if( have_rows( 'comments', $postid ) ):
  while( have_rows( 'comments', $postid ) ): the_row();
    $time_posted = get_sub_field( 'time', $postid );
    $posted = get_sub_field( 'posted_by', $postid );
    $comment = get_sub_field( 'comment', $postid );
    $answerresponse = get_sub_field( 'answer', $postid );

    $value[] = array(
      "time"        => $time_posted,
      "posted_by"   => $posted,
      "comment"     => $comment,
      "answer"          => $answerresponse
    );
  endwhile;
endif;

$submit = "submit-" . $counter;
if(isset($_POST[$submit])){
  $form = "forum-comment-" . $counter;
  $finalanswer = "answer-" . $counter;
  $finalanswer = $_POST[$finalanswer];
  $comment = $_POST[$form];

  //if ($comment != "") {
    $time_posted = date('Y-m-d H:i:s', time());

    // Comments
    $postid = get_the_id();
    $field_key = "field_5c90d272c7ca9";

    $value[] = array(
      "time"          => $time_posted,
      "posted_by"     => $current_user->ID,
      "answer"              => $finalanswer,
      "comment"       => $comment,
    );

    update_field( $field_key, $value, $postid );
  //}
}
?>

ACF 字段布局:

if( function_exists('acf_add_local_field_group') ):

acf_add_local_field_group(array(
    'key' => 'group_5c90d20a076ab',
    'title' => 'Comments',
    'fields' => array(
        array(
            'key' => 'field_5c90d272c7ca9',
            'label' => 'Comments',
            'name' => 'comments',
            'type' => 'repeater',
            'instructions' => '',
            'required' => 0,
            'conditional_logic' => 0,
            'wrapper' => array(
                'width' => '',
                'class' => '',
                'id' => '',
            ),
            'collapsed' => '',
            'min' => 0,
            'max' => 0,
            'layout' => 'block',
            'button_label' => 'Add Comment',
            'sub_fields' => array(
                array(
                    'key' => 'field_5c90f06883914',
                    'label' => 'Time',
                    'name' => 'time',
                    'type' => 'date_time_picker',
                    'instructions' => '',
                    'required' => 0,
                    'conditional_logic' => 0,
                    'wrapper' => array(
                        'width' => '33',
                        'class' => '',
                        'id' => '',
                    ),
                    'display_format' => 'Y-m-d H:i:s',
                    'return_format' => 'Y-m-d H:i:s',
                    'first_day' => 1,
                ),
                array(
                    'key' => 'field_5c90ee4fc7cac',
                    'label' => 'Posted by',
                    'name' => 'posted_by',
                    'type' => 'user',
                    'instructions' => '',
                    'required' => 0,
                    'conditional_logic' => 0,
                    'wrapper' => array(
                        'width' => '33',
                        'class' => '',
                        'id' => '',
                    ),
                    'role' => '',
                    'allow_null' => 0,
                    'multiple' => 0,
                    'return_format' => 'array',
                ),
                array(
                    'key' => 'field_5c90d38cc7cab',
                    'label' => 'Answer?',
                    'name' => 'answer',
                    'type' => 'text',
                    'instructions' => 'Change to "Yes" to mark as the answer',
                    'required' => 0,
                    'conditional_logic' => 0,
                    'wrapper' => array(
                        'width' => '33',
                        'class' => '',
                        'id' => '',
                    ),
                    'default_value' => 'No',
                    'placeholder' => '',
                    'prepend' => '',
                    'append' => '',
                    'maxlength' => '',
                ),
                array(
                    'key' => 'field_5c90d28ac7caa',
                    'label' => 'Comment',
                    'name' => 'comment',
                    'type' => 'textarea',
                    'instructions' => '',
                    'required' => 0,
                    'conditional_logic' => 0,
                    'wrapper' => array(
                        'width' => '100',
                        'class' => '',
                        'id' => '',
                    ),
                    'default_value' => '',
                    'placeholder' => '',
                    'maxlength' => '',
                    'rows' => '',
                    'new_lines' => '',
                ),
            ),
        ),
    ),
    'location' => array(
        array(
            array(
                'param' => 'post_type',
                'operator' => '==',
                'value' => 'forum',
            ),
        ),
    ),
    'menu_order' => 0,
    'position' => 'normal',
    'style' => 'default',
    'label_placement' => 'top',
    'instruction_placement' => 'label',
    'hide_on_screen' => array(
        0 => 'excerpt',
        1 => 'discussion',
        2 => 'comments',
        3 => 'slug',
        4 => 'author',
        5 => 'format',
        6 => 'page_attributes',
        7 => 'featured_image',
        8 => 'categories',
        9 => 'tags',
        10 => 'send-trackbacks',
    ),
    'active' => true,
    'description' => '',
));

endif;

【问题讨论】:

  • 你试过类似$value = get_field( $field_key ); $value[] = [ ... new data ... ]; update_field( $field_key, $value ); $value = get_field( $field_key );的东西吗?
  • @Rob,“在此之上” - 对不起,“这个”是什么?表格?或者您是否显示来自$value 数组的数据?这意味着在表格的正下方?您能否导出您的 ACF 字段设置,以便我们(希望)重现该问题?或者comments 是转发器还是灵活的内容字段? (抱歉有很多问题..)
  • 感谢您的澄清,@Rob。那么在调用update_field()之后,还需要对$value数组做些什么吗?
  • 不,我很确定这不是缓存问题。 $counter 是什么?它是如何/在哪里定义的?
  • 好的,@Rob。我(想我)实际上知道发生了什么以及应该做什么。我会尽快发布答案。

标签: php advanced-custom-fields


【解决方案1】:

在输出 cmets 数据后,有表单(显示在 上面的问题)然后是下面的update_field 函数(也在 上面的问题)

所以实际上,问题在于——您应该在页面渲染之前而不是之后更新字段

工作解决方案

所以我将表单发布到wp-admin/admin-post.php,它会触发钩子admin_post_{action}(对于经过身份验证的用户)或admin_post_nopriv_{action}(对于未经过身份验证的用户)。您可以使用init 钩子或任何类似的钩子,但我认为admin-post.php 是处理表单提交的好方法,无论是通过GET 还是POST 方法——如果您熟悉@ 987654331@,然后admin_post_{action} 类似,除了非AJAX请求。

HTML + PHP 表单

<form action="<?php echo admin_url( 'admin-post.php' ); ?>" class="forum-post-comment-form" id="forum-comment-<?php echo $counter; ?>" method="post">
  <input type="text" placeholder="Type your answer here" class="forum-comment-box" id="forum-comment-<?php echo $counter; ?>" name="forum_comment" />

  <!-- I manually added these radios; make sure to edit the code.. -->
  <div>
    Mark as the answer?
    <label><input type="radio" name="answer" value="Yes" /> Yes</label>
    <label><input type="radio" name="answer" value="No" /> No</label>
  </div>

  <!-- Hidden data for add_forum_comment() which updates the field. -->
  <input type="hidden" name="counter" value="<?php echo $counter; ?>" />
  <input type="hidden" name="post_id" value="<?php echo $postid; ?>" />
  <input type="hidden" name="action" value="add-forum-comment" />

  <span><input type="submit" class="comment-submit-btn" name="submit" value=""></span>
</form>

处理表单提交的 PHP 函数

add_action( 'admin_post_add-forum-comment', 'add_forum_comment' );        // for authenticated users
//add_action( 'admin_post_nopriv_add-forum-comment', 'add_forum_comment' ); // for non-authenticated users
function add_forum_comment() {
    // Check if the post is valid.
    $postid = filter_input( INPUT_POST, 'post_id' );
    if ( ! $post = get_post( $postid ) ) {
        wp_die( 'The post does not exist.' );
    }

    // Check if we've got a valid comment.
    $posted_comment = filter_input( INPUT_POST, 'forum_comment' );
    if ( ! $posted_comment ) {
        // Redirect back to the post.
        wp_redirect( get_permalink( $postid ) );
        exit;
    }


    // Initialize $value and fill it with existing values.
    $value = array();
    if( have_rows( 'comments', $postid ) ):
      while( have_rows( 'comments', $postid ) ): the_row();
        $time_posted = get_sub_field( 'time', $postid );
        $posted = get_sub_field( 'posted_by', $postid );
        $comment = get_sub_field( 'comment', $postid );
        $answerresponse = get_sub_field( 'answer', $postid );

        $value[] = array(
          "time"      => $time_posted,
          "posted_by" => $posted,
          "comment"   => $comment,
          'answer'    => $answerresponse,
        );
      endwhile;
    endif;


    // Now update the ACF field.
    $counter = filter_input( INPUT_POST, 'counter' );
    $finalanswer = filter_input( INPUT_POST, 'answer' );

    $time_posted = date('Y-m-d H:i:s', time());

    // Comments
    $field_key = "field_5c90d272c7ca9";

    $value[] = array(
      "time"      => $time_posted,
      "posted_by" => get_current_user_id(),
      'answer'    => $finalanswer,
      "comment"   => $posted_comment,
    );

    update_field( $field_key, $value, $postid );


    // Redirect back to the post.
    wp_redirect( get_permalink( $postid ) );
    exit;

}

久经考验的工作。而且您不必使用完全相同的代码,但我希望代码对您有所帮助。另外,我使用get_current_user_id() 来获取当前用户的ID。

【讨论】:

  • 太棒了!非常感谢!不得不进行一些小的调整,但现在一切正常。你总是给出这么详细的答案!
  • 是的,我一直在尝试。 :) 在代码中,我认为您可能不需要将 $counter 传递给 PHP 函数,但我将代码保留在那里供您参考。
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 2020-03-15
  • 2012-02-10
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多