我正在为类中的wordpress写一个插件,我在类的构造函数中添加了一个动作钩子'save_post'。然而它似乎没有发射。我是以正确的方式使用它吗?
EDIT 25-05-2014 - 我写了一个新的(测试过的)最小例子,它肯定会为我重现这个问题。
如果我以程序方式使用save_post(比如直接在index.php中),它确实有用,但是当我在类中构造所有内容时,这显然没有用。
/*
File index.php
This file handles the installation and bootstrapping of the plugin
*/
define("XX_POST_TYPE", 'testposttype');
if( !class_exists('MyPlugin') ):
class MyPlugin {
var $savecontroller;
public function __construct(){
add_action('init', array($this, 'init'), 1);
//include stuff before activation of theme
$this->include_before_theme();
}
//Include these before loading theme
private function include_before_theme(){
include_once("controllers/savecontroller.php");
}
public function init(){
register_post_type( XX_POST_TYPE,
array(
'labels' => array(
'name' => __('Tests'),
'singular_name' => __('Test'),
'add_new' => __('Add new test'),
'add_new_item' => __('Add new test')
),
'public' => true,
'has_archive' => true,
'hierarchical' => true
)
);
add_action('add_meta_boxes', function(){
$this->savecontroller = new SaveController();
});
}
}
function startup(){
global $myPlugin;
if( !isset($myPlugin) ){
$myPlugin = new MyPlugin();
}
return $myPlugin;
}
//Initialize
startup();
endif;
?>
保存操作发生在不同的类和文件中。
<?php
// file savecontroller.php
class SaveController{
public function __construct(){
add_meta_box('xx_field_box', 'Field', array($this, 'setup_field'), XX_POST_TYPE);
}
public function setup_field( $post ){
?>
<input type="text" name="xx_custom_field" id="xx_custom_field" value="">
<?php
add_action('save_post', array($this, 'save_my_post'), 1, 1);
}
public function save_my_post($post_id){
if(isset($_POST['xx_custom_field'])){
update_post_meta($post_id, 'xx_custom_field', $_POST['xx_custom_field']);
}
}
}
?>
它确实创建了我的自定义posttype和字段,因此我知道这些类正在运行。但是不会触发save_post。它不会'die()'而且它不会执行'update_post_meta()'。自定义字段确实出现在POST请求中,因此isset()会检出。
这可能是愚蠢的事,但我无法让它发挥作用。
答案 0 :(得分:1)
您正在尝试在save_post
回调中添加add_meta_box
内的init
,但这不是它的地方。
要解决此问题,请将public function init(){
register_post_type( $args );
$this->savecontroller = new SaveController();
}
方法更改为
SaveController
并将class SaveController{
public function __construct(){
add_action( 'add_meta_boxes', array( $this, 'meta_box' ) );
add_action( 'save_post', array( $this, 'save_my_post'), 10, 2 );
}
public function meta_box(){
add_meta_box( 'xx_field_box', 'Field', array($this, 'setup_field'), XX_POST_TYPE );
}
public function setup_field( $post ){
?>
<input type="text" name="xx_custom_field" id="xx_custom_field" value="">
<?php
}
public function save_my_post( $post_id, $post_object ){
wp_die( '<pre>'. print_r( $post_object, true) . '</pre>' );
}
}
修改为
save_post
请注意,10
操作需要两个参数,优先级可以是默认值(save_post
)。您可以找到许多元框示例和{{1}} here。