在写入数据库之前更改内容

时间:2013-03-23 作者:Eckstein

我到处找了找,但我不能确定这个问题的答案。我试图将自定义字段的内容用作post\\U数据,并在创建或更新帖子时将其保存到数据库中。我需要这样做,以便使用插件高级自定义字段实现前端发布解决方案。

我想我需要这样的东西:

function tsv_content_save_pre( $post_id ){
            global $post;
            $tsvpost = get_post($post_id);
            $tsvifempty = $tsvpost->post_content; //The "real" post_content
            $tsvcontent = get_field(\'article_content\'); //The custom content

            if ($tsvifempty == NULL) { //Check if the "real" post content has anything in it first.

        $tsvargs = array(\'post_content\' => $tsvcontent);
        wp_update_post ($tsvargs);

            }       
    }
        add_filter(\'content_save_pre\'  , \'tsv_content_save_pre\'  );
但我被困在那里了。我不是插件开发人员,所以过滤器之类的东西对我来说很难导航。有人能帮我指出正确的方向吗?

提前谢谢。

3 个回复
SO网友:s_ha_dum

第一content_save_pre 是一个非常古老的钩子。Adam Brown has a warning that:

最新版本的WordPress(3.5)中没有此挂钩。Do not use it. 它已弃用。您应该查看下面的“相关挂钩”列表,看看是否可以找出是什么替代了它。

我会建议一个类似于我为question asking about restricting status changes based on content word count.

密切关注您的代码,解决方案应如下所示:

function cmeta_as_content_wpse_92012($data){
  if (!empty($data[\'post_content\'])) {
    $tsvcontent = get_field(\'article_content\'); //The custom content
    $data[\'post_content\'] = $tsvcontent;
  }
  return $data;
}
add_action(\'wp_insert_post_data\',\'cmeta_as_content_wpse_92012\');
但我担心:

我不知道get_field 如果我找到了get_field 这个函数看起来像是从数据库中提取数据,因此它对更新帖子没有任何好处,除非您更新帖子和Posteta,然后运行另一个查询来更改帖子数据,这看起来很浪费。您的问题确实指定了“在写入数据库之前”$_POST 直接获取数据。

function cmeta_as_content_wpse_92012($data){
  global $_POST;
  if (!empty($data[\'post_content\']) && !empty($_POST[\'meta\'])) {
    foreach ($_POST[\'meta\'] as $v) {
      if (\'article_content\' == $v[\'key\']) {
        $data[\'post_content\'] = wp_kses( $v[\'value\'] ); // The custom content
      }
    }
  }
  // var_dump($_POST,$data); die; // debugging
  return $data; 
}
add_action(\'wp_insert_post_data\',\'cmeta_as_content_wpse_92012\',1);
还有更多注意事项:

我不记得WordPress在哪一步应用了自己的过滤器,所以我应用了wp_ksesvalidation function 如果有多个自定义元字段具有相同的键,则需要--article_content-- 将使用最后一个,并且仅使用最后一个

SO网友:montrealist

我认为在参数数组中需要有一个post ID。从…起the doc:

填写ID字段并不是绝对必要的,但如果没有它,使用该函数就没有什么意义。

$tsvargs = array(
\'ID\'                => $post_id,
\'post_modified\'     => date("Y-m-d H:i:s"),
\'post_modified_gmt\' => date("Y-m-d H:i:s"),
\'post_content\'      => $tsvcontent
);
$post_id = wp_update_post($tsvargs);
if ($post_id == 0) {
    // handle error here
}

SO网友:Eckstein

好的,通过WPQ提问。com我能找到人来解决这个问题。它需要两个功能,一个用于处理前端的过帐,另一个用于处理后端的过帐。由于ACF使用一个名为ACF/save\\U post的自定义函数,而不是WP native save\\U post,因此需要进行一些额外的工作。

以下是最终的工作解决方案:

    //Save ACF field as post_content for back-end
add_action(\'save_post\', \'change_content\');

function change_content($post_id) {

        $post_content = get_post_meta($post_id,\'article_content\',true);



        $my_post = array();

                $my_post[\'ID\'] = $post_id;

                $my_post[\'post_content\'] = $post_content;

remove_action(\'save_post\', \'change_content\');

                    wp_update_post( $my_post );

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

    }

//Save ACF field as post_content for front-end

add_action(\'acf/save_post\', \'change_content_frontend\');

function change_content_frontend($post_id) {

        $post_content = get_post_meta($post_id,\'article_content\',true);



        $my_post = array();

                $my_post[\'ID\'] = $post_id;

                $my_post[\'post_content\'] = $post_content;

remove_action(\'acf/save_post\', \'change_content_frontend\');

                    wp_update_post( $my_post );

add_action(\'acf/save_post\', \'change_content_frontend\');

    }
希望这能帮助尝试做类似事情的人!

结束

相关推荐

向函数添加APPLY_FILTERS有什么不利影响吗?

我将回顾我以前的WordPress主题,使函数可过滤,并添加函数\\u exists检查。我有没有想过这会导致现有代码出现问题?// Dummy function if ( ! function_exists( \'custom_func\' )) { function custom_func() { $output = \"Something Awesome\"; return apply_filters(\'custom_func

在写入数据库之前更改内容 - 小码农CODE - 行之有效找到问题解决它

在写入数据库之前更改内容

时间:2013-03-23 作者:Eckstein

我到处找了找,但我不能确定这个问题的答案。我试图将自定义字段的内容用作post\\U数据,并在创建或更新帖子时将其保存到数据库中。我需要这样做,以便使用插件高级自定义字段实现前端发布解决方案。

我想我需要这样的东西:

function tsv_content_save_pre( $post_id ){
            global $post;
            $tsvpost = get_post($post_id);
            $tsvifempty = $tsvpost->post_content; //The "real" post_content
            $tsvcontent = get_field(\'article_content\'); //The custom content

            if ($tsvifempty == NULL) { //Check if the "real" post content has anything in it first.

        $tsvargs = array(\'post_content\' => $tsvcontent);
        wp_update_post ($tsvargs);

            }       
    }
        add_filter(\'content_save_pre\'  , \'tsv_content_save_pre\'  );
但我被困在那里了。我不是插件开发人员,所以过滤器之类的东西对我来说很难导航。有人能帮我指出正确的方向吗?

提前谢谢。

3 个回复
SO网友:s_ha_dum

第一content_save_pre 是一个非常古老的钩子。Adam Brown has a warning that:

最新版本的WordPress(3.5)中没有此挂钩。Do not use it. 它已弃用。您应该查看下面的“相关挂钩”列表,看看是否可以找出是什么替代了它。

我会建议一个类似于我为question asking about restricting status changes based on content word count.

密切关注您的代码,解决方案应如下所示:

function cmeta_as_content_wpse_92012($data){
  if (!empty($data[\'post_content\'])) {
    $tsvcontent = get_field(\'article_content\'); //The custom content
    $data[\'post_content\'] = $tsvcontent;
  }
  return $data;
}
add_action(\'wp_insert_post_data\',\'cmeta_as_content_wpse_92012\');
但我担心:

我不知道get_field 如果我找到了get_field 这个函数看起来像是从数据库中提取数据,因此它对更新帖子没有任何好处,除非您更新帖子和Posteta,然后运行另一个查询来更改帖子数据,这看起来很浪费。您的问题确实指定了“在写入数据库之前”$_POST 直接获取数据。

function cmeta_as_content_wpse_92012($data){
  global $_POST;
  if (!empty($data[\'post_content\']) && !empty($_POST[\'meta\'])) {
    foreach ($_POST[\'meta\'] as $v) {
      if (\'article_content\' == $v[\'key\']) {
        $data[\'post_content\'] = wp_kses( $v[\'value\'] ); // The custom content
      }
    }
  }
  // var_dump($_POST,$data); die; // debugging
  return $data; 
}
add_action(\'wp_insert_post_data\',\'cmeta_as_content_wpse_92012\',1);
还有更多注意事项:

我不记得WordPress在哪一步应用了自己的过滤器,所以我应用了wp_ksesvalidation function 如果有多个自定义元字段具有相同的键,则需要--article_content-- 将使用最后一个,并且仅使用最后一个

SO网友:montrealist

我认为在参数数组中需要有一个post ID。从…起the doc:

填写ID字段并不是绝对必要的,但如果没有它,使用该函数就没有什么意义。

$tsvargs = array(
\'ID\'                => $post_id,
\'post_modified\'     => date("Y-m-d H:i:s"),
\'post_modified_gmt\' => date("Y-m-d H:i:s"),
\'post_content\'      => $tsvcontent
);
$post_id = wp_update_post($tsvargs);
if ($post_id == 0) {
    // handle error here
}

SO网友:Eckstein

好的,通过WPQ提问。com我能找到人来解决这个问题。它需要两个功能,一个用于处理前端的过帐,另一个用于处理后端的过帐。由于ACF使用一个名为ACF/save\\U post的自定义函数,而不是WP native save\\U post,因此需要进行一些额外的工作。

以下是最终的工作解决方案:

    //Save ACF field as post_content for back-end
add_action(\'save_post\', \'change_content\');

function change_content($post_id) {

        $post_content = get_post_meta($post_id,\'article_content\',true);



        $my_post = array();

                $my_post[\'ID\'] = $post_id;

                $my_post[\'post_content\'] = $post_content;

remove_action(\'save_post\', \'change_content\');

                    wp_update_post( $my_post );

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

    }

//Save ACF field as post_content for front-end

add_action(\'acf/save_post\', \'change_content_frontend\');

function change_content_frontend($post_id) {

        $post_content = get_post_meta($post_id,\'article_content\',true);



        $my_post = array();

                $my_post[\'ID\'] = $post_id;

                $my_post[\'post_content\'] = $post_content;

remove_action(\'acf/save_post\', \'change_content_frontend\');

                    wp_update_post( $my_post );

add_action(\'acf/save_post\', \'change_content_frontend\');

    }
希望这能帮助尝试做类似事情的人!

相关推荐

添加到数组并通过do_action/Apply_Filters传递它

作为练习,我正在使用PHPclass to add meta boxes 我在GitHub上找到了。我只是复制了代码,现在我正在玩它来理解它。其工作原理如下:包含该类的文件包含在init中。在该文件内部,但在类外部,有一个空数组$meta_boxes 已初始化之后,使用apply_filters. 我猜是apply_filters 使用而不是do_action 因为后者不返回任何内容——$meta_boxes = apply_filters( \'cmb_meta_boxes\', $meta_boxes