Wordpress:每次我尝试'save_post'时,save_post缺少$ _POST

时间:2014-05-06 17:23:38

标签: php wordpress wordpress-plugin

<?php
    use \Core\Core;
    use \View\View;
    use \Assets\Asset;

    class PostHook implements \Core\Page
    {
        public static function make() {
            return new PostHook;
        }

        public function load()
        {
            add_action('load-post.php', array($this, 'loadPostMeta'));
            add_action('load-post-new.php', array($this, 'loadPostMeta'));
            add_action('init', array($this, 'init'));

        }

        public function init()
        {
            add_action('save_post', array($this, 'savePostMeta'), 11, 2);
        }

        public function loadPostMeta()
        {
            add_action('add_meta_boxes', array($this, 'addMetaBoxes'));
        }

        public function addMetaBoxes()
        {
            add_meta_box(
                    'cad-attachment-box',
                    'Downloadable Attachments',
                    array($this, 'showMetaBox'),
                    'post',
                    'side',
                    'high'
                );
        }

        public function showMetaBox($object, $box)
        {
            $options = array(
                    'object'    => $object,
                    'box'       => $box,
                    'value'     => get_post_meta($object->ID, '_downloadables', true)
                );


            echo View::factorize('posts/meta_hook.html.twig')->load($options);
        }

        public function savePostMeta($post_id, $post)
        {


            $meta       = isset($_POST['_downloadables']) ? $_POST['_downloadables'] : 'none'; 
            $oldMeta    = get_post_meta($post_id, '_downloadables', true);

            if($oldMeta == '' && $meta) {
                add_post_meta($post_id, '_downloadables', $meta, true);
            }else {
                update_post_meta($post_id, '_downloadables', $meta);
            }
        }

        public static function post()
        {

        }
    }

请注意,在实例化整个插件时会调用load()函数。

每次我尝试将_downloadables保存到wp_postmeta时,由于'none'功能中的isset()代码,它始终返回saveMeta()。我试过了

  • 将优先级添加到save_post
  • 转储到save_post
  • 抓住$_POST,但总是失败。有什么建议吗?
  • $_POST没有任何数据,如果我尝试var_dump它或保存整个$_POST insdide wp_postmeta

1 个答案:

答案 0 :(得分:0)

这种情况很可能发生,因为你的函数中第二个参数没有默认值,并且没有在add_action()中指定一些参数 - 这是&#之后的第四个参数34;处理&#34;,&#34;功能&#34;和&#34;优先级&#34;。结果是对savePostMeta()的调用因为缺少参数而失败,因为没有默认值。有几种方法可以解决此问题 - 将缺少的参数添加到add_action(),为$post提供默认值,或者完全删除$post参数,因为您没有使用它。

  • 选项1:更新add_action()

    // Priority 10 (default) and 2 arguments
    add_action('init', array( $this, 'init' ), 10, 2 );
    
  • 选项2:为$post提供默认值

    // Give $post a default value of "false" in case it isn't passed in
    public function savePostMeta( $post_id, $post=false ){
        // ...your code
    }
    
  • 选项3:删除$post,因为您没有使用它

    // Only use a single argument to your function
    public function savePostMeta( $post_id ){
        // ...your code
    }
    

FWIW我会选择1/2,因为它是&#34;正确&#34;如果你希望将来使用$post,还有更多的未来证明。您通常也可以按照以下方式清理代码 - $meta并设置始终,并且您只需拨打update_post_meta(),无需获取值或致电add_post_meta()

add_action('init', array( $this, 'init' ), 10, 2 );

public function savePostMeta( $post_id, $post=false ){
    $meta_key = '_downloadables';
    $meta_value = isset( $_POST[$meta_key] )? 
        $_POST[$meta_key] : 
        'none'; 
    update_post_meta( $post_id, $meta_key, $meta_value );
}