没有为我的自定义帖子类型保存自定义元框的值

时间:2021-09-21 作者:Ricky

我已经创建了一个虚拟post类型来检查值,无论它是否被保存。但是,它正在保存“文本输入和文本区域”的值,但未保存其余值(复选框、选择、图像):(

我的代码是:

function add_your_fields_meta_box()
{
    add_meta_box(\'your_fields_meta_box\', // $id
    \'Your Fields\', // $title
    \'show_your_fields_meta_box\', // $callback
    \'your_post\', // $screen
    \'normal\', // $context
    \'high\'
    // $priority
    );
}
add_action(\'add_meta_boxes\', \'add_your_fields_meta_box\');

function show_your_fields_meta_box()
{
    global $post;

    $meta = get_post_meta($post->ID, \'your_fields\', true); ?>

  <input type="hidden" name="your_meta_box_nonce" value="<?php echo wp_create_nonce(basename(__FILE__)); ?>">

  <p>
    <label for="your_fields[text]">Input Text</label>
    <br>
    <input type="text" name="your_fields[text]" id="your_fields[text]" class="regular-text" value="<?php if (is_array($meta) && isset($meta[\'text\']))
    {
        echo $meta[\'text\'];
    } ?>">
  </p>
  <p>
    <label for="your_fields[textarea]">Textarea</label>
    <br>
    <textarea name="your_fields[textarea]" id="your_fields[textarea]" rows="5" cols="30" style="width:500px;"><?php if (is_array($meta) && isset($meta[\'textarea\']))
    {
        echo $meta[\'textarea\'];
    } ?></textarea>
  </p>
  <p>
    <label for="your_fields[checkbox]">Checkbox
            <input type="checkbox" name="your_fields[checkbox]" value="checkbox" <?php if (is_array($meta) [\'checkbox\'] === \'checkbox\') echo \'checked\'; ?>>
        </label>
  </p>
  <p>
    <label for="your_fields[select]">Select Menu</label>
    <br>
    <select name="your_fields[select]" id="your_fields[select]">
                <option value="option-one" <?php selected(is_array($meta) [\'select\'], \'option-one\'); ?>>Option One</option>
                <option value="option-two" <?php selected(is_array($meta) [\'select\'], \'option-two\'); ?>>Option Two</option>
        </select>
  </p>
  <p>
    <label for="your_fields[image]">Image Upload</label><br>
    <input type="text" name="your_fields[image]" id="your_fields[image]" class="meta-image regular-text" value="<?php echo is_array($meta) [\'image\']; ?>">
    <input type="button" class="button image-upload" value="Browse">
  </p>
  <div class="image-preview"><img src="<?php echo is_array($meta) [\'image\']; ?>" style="max-width: 250px;"></div>


  <script>
    jQuery(document).ready(function ($) {
      // Instantiates the variable that holds the media library frame.
      var meta_image_frame;
      // Runs when the image button is clicked.
      $(\'.image-upload\').click(function (e) {
        // Get preview pane
        var meta_image_preview = $(this).parent().parent().children(\'.image-preview\');
        // Prevents the default action from occuring.
        e.preventDefault();
        var meta_image = $(this).parent().children(\'.meta-image\');
        // If the frame already exists, re-open it.
        if (meta_image_frame) {
          meta_image_frame.open();
          return;
        }
        // Sets up the media library frame
        meta_image_frame = wp.media.frames.meta_image_frame = wp.media({
          title: meta_image.title,
          button: {
            text: meta_image.button
          }
        });
        // Runs when an image is selected.
        meta_image_frame.on(\'select\', function () {
          // Grabs the attachment selection and creates a JSON representation of the model.
          var media_attachment = meta_image_frame.state().get(\'selection\').first().toJSON();
          // Sends the attachment URL to our custom image input field.
          meta_image.val(media_attachment.url);
          meta_image_preview.children(\'img\').attr(\'src\', media_attachment.url);
        });
        // Opens the media library frame.
        meta_image_frame.open();
      });
    });
  </script>

  <?php
}
function save_your_fields_meta($post_id)
{
    // verify nonce
    if (isset($_POST[\'your_meta_box_nonce\']) && !wp_verify_nonce($_POST[\'your_meta_box_nonce\'], basename(__FILE__)))
    {
        return $post_id;
    }
    // check autosave
    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)
    {
        return $post_id;
    }
    // check permissions
    if (isset($_POST[\'post_type\']))
    { //Fix 2
        if (\'page\' === $_POST[\'post_type\'])
        {
            if (!current_user_can(\'edit_page\', $post_id))
            {
                return $post_id;
            }
            elseif (!current_user_can(\'edit_post\', $post_id))
            {
                return $post_id;
            }
        }
    }

    $old = get_post_meta($post_id, \'your_fields\', true);
    if (isset($_POST[\'your_fields\']))
    { //Fix 3
        $new = $_POST[\'your_fields\'];
        if ($new && $new !== $old)
        {
            update_post_meta($post_id, \'your_fields\', $new);
        }
        elseif (\'\' === $new && $old)
        {
            delete_post_meta($post_id, \'your_fields\', $old);
        }
    }
}

add_action(\'save_post\', \'save_your_fields_meta\');

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

但未保存剩余值(复选框、选择、图像)

我相信这些字段也得到了保存,但您只是没有正确显示它们。你应该always escape input/textarea values, e、 g.使用esc_attr() 对于单线输入和esc_textarea() 对于文本区域(多行输入)。

因此,要使代码正常工作,请尝试以下方法:

首先,您可以为your_fields meta像这样使用wp_parse_args():

$meta = get_post_meta($post->ID, \'your_fields\', true);

// Merge with default values, ensuring all keys are set.
$meta = wp_parse_args( $meta, array(
    \'text\'     => \'\',
    \'textarea\' => \'\',
    \'checkbox\' => \'\',
    \'select\'   => \'\',
    \'image\'    => \'\',
) );

<input type="text" name="your_fields[text]" id="your_fields[text]" class="regular-text"
    value="<?php echo esc_attr( $meta[\'text\'] ); ?>">

<textarea name="your_fields[textarea]" id="your_fields[textarea]" rows="5" cols="30"
    style="width:500px;"><?php echo esc_textarea( $meta[\'textarea\'] ); ?></textarea>

<input type="checkbox" name="your_fields[checkbox]" value="checkbox"
    <?php checked( $meta[\'checkbox\'], \'checkbox\' ); ?>>

<select name="your_fields[select]" id="your_fields[select]">
    <option value="">Select..</option>
    <option value="option-one"<?php selected( $meta[\'select\'], \'option-one\' ); ?>>Option One</option>
    <option value="option-two"<?php selected( $meta[\'select\'], \'option-two\' ); ?>>Option Two</option>
</select>

<input type="text" name="your_fields[image]" id="your_fields[image]"
    class="meta-image regular-text" value="<?php echo esc_attr( $meta[\'image\'] ); ?>">

相关推荐

WordPress摘录-如何使用unctions.php删除第一个链接

我刚刚将一个博客导入Wordpress,所有内容都以以下内容开头:<a href="itunes.com">Listen on iTunes</a> 然后是段落内容,因此所有节选都显示为“;收听iTunes内容摘录"E;我尝试了这里的一些自定义函数,但似乎没有一个能起到作用。在不必移动iTunes链接的情况下删除Listen on iTunes文本的最佳方法是什么?例如,我试过这个。。。没有运气。。。 function custom_ex