为什么我的save_post操作不会触发?

时间:2014-05-24 19:13:47

标签: php wordpress plugins save

我正在为类中的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()会检出。

这可能是愚蠢的事,但我无法让它发挥作用。

1 个答案:

答案 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