<?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
答案 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 );
}