我正在尝试获取一个自定义字段值(“bildname”)作为我的帖子标题,另一个字段(“bildbeschribung”)作为我的自定义帖子类型中的内容。但这并没有真正起作用。首先,它不断为我的标题输出“自动草稿”。所以我开始在这里进行研究,然后我设法在后端将其显示为标题,但在使用here. 似乎它并没有真正覆盖数据库条目。
所以现在我一直在使用中建议的代码another Forum:
//SAVE CUSTOM FIELD "TITLE" AS TITLE
add_action(\'save_post\', \'change_title\');
function change_title($post_id) {
$post_title = get_post_meta($post_id,\'bildname\',true);
$my_post = array();
$my_post[\'ID\'] = $post_id;
$my_post[\'post_title\'] = $post_title;
remove_action(\'save_post\', \'change_title\');
wp_update_post( $my_post );
add_action(\'save_post\', \'change_title\');
}
// SAVE CUSTOM FIELD INPUT CONTENT AS POST CONTENT
add_action(\'save_post\', \'change_content\');
function change_content($post_id) {
$post_content = get_post_meta($post_id,\'bildbeschreibung\',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\');
}
这似乎很好,直到我意识到它现在也会改变我页面的标题。从我在原始标题字段中设置的标题改为“无”。因为我没有页面的自定义字段“标题”。
现在我需要帮助修改我找到的函数,这只会影响我的自定义帖子类型“albertis kunstwerke”。
我找到了这段代码,应该是用来判断我是否在某个页面上,或者在某个帖子上,或者其他什么地方。
function get_current_post_type() {
global $post, $typenow, $current_screen;
//we have a post so we can just get the post type from that
if ( $post && $post->post_type )
return $post->post_type;
//check the global $typenow - set in admin.php
elseif( $typenow )
return $typenow;
//check the global $current_screen object - set in sceen.php
elseif( $current_screen && $current_screen->post_type )
return $current_screen->post_type;
//lastly check the post_type querystring
elseif( isset( $_REQUEST[\'post_type\'] ) )
return sanitize_key( $_REQUEST[\'post_type\'] );
//we do not know the post type!
return null;
}
它来自
http://themergency.com/wordpress-tip-get-post-type-in-admin/ 但我不知道如何将其与上面的代码结合起来,所以标题更改只会发生在我的CPT“albertis kunstwerke”上
所以,再一次。我想实现的是让我的自定义字段“bildname”(我用高级自定义字段插件创建的)成为我的帖子标题。但这只应该发生在自定义帖子类型“albertis kunstwerke”上。我需要能够禁用它的网页,因为我没有一个自定义字段“bildname”。
如果你们想知道的话,我不能使用常规标题字段,因为它被特别要求使用所有自定义字段。
最合适的回答,由SO网友:s_ha_dum 整理而成
您正在使用的解决方案将始终表示多个数据库插入,因为帖子将被保存,然后在第二次数据库写入中重新保存标题。这就是save_post
钩子,因为它在主post保存之后运行。
此外,您发现的代码过于复杂。
有趣的是,你链接到的论坛中的OP在开头的帖子中走上了正确的轨道,然后在我看来,被错误地引导到了一个不太理想的解决方案,不幸的是你已经遵循了。
你应该用的钩子是wp_insert_post_data
. 该挂钩允许您在初始保存之前更改post数据,从而为您保存数据库写入。在大多数情况下,性能差异不会太大,但一点点积累在一起,为什么它是二流的,而一流的并不那么难呢?
function meta_value_title_wpse_126764($data){
global $_POST;
if (\'your-cpt\' = get_post_type() && !empty($_POST[\'meta\'])) {
foreach ($_POST[\'meta\'] as $v) {
if (\'meta_title\' == $v[\'key\']) {
$data[\'post_title\'] = wp_kses( $v[\'value\'] ); // The custom content
}
}
}
// var_dump($_POST,$data); die; // debugging
return $data;
}
add_action(\'wp_insert_post_data\',\'meta_value_title_wpse_126764\',1);
这与
here 还有同样的警告:
我不记得WordPress在哪一步应用了自己的过滤器,所以我应用了wp_kses
第1项可能有点过分validation function 如果有多个自定义元字段具有相同的键,则需要--article_content
-- 将使用最后一个,并且仅使用最后一个
SO网友:deadfishli
因此s_ha_dum\'我找到了一些其他代码,可以发布新帖子,也可以编辑旧帖子,标题按我想要的方式保存。我把它和if条件结合在一起s_ha_dum\'现在它不再删除我的页面标题。
到目前为止,这似乎是可行的。我会继续测试,并希望它能与我需要做的所有其他事情一起工作。
正如建议的那样,这是我现在正在使用的代码here.如果有人有任何改进,我很高兴听到=)
//Save ACF field as post_content for back-end
add_action(\'save_post\', \'change_title_albertis\');
function change_title_albertis($post_id) {
global $_POST;
if(\'albertis-kunstwerke\'== get_post_type())
{
$post_custom_title = get_post_meta($post_id,\'bildname\',true);
$my_post = array();
$my_post[\'ID\'] = $post_id;
$my_post[\'post_title\'] = $post_custom_title;
remove_action(\'save_post\', \'change_title_albertis\');
wp_update_post( $my_post );
add_action(\'save_post\', \'change_title_albertis\');
}
}
//Save ACF field as post_content for front-end
add_action(\'acf/save_post\', \'change_title_frontend_albertis\');
function change_title_frontend_albertis($post_id) {
global $_POST;
if(\'albertis-kunstwerke\'== get_post_type())
{
$post_custom_title = get_post_meta($post_id,\'bildname\',true);
$my_post = array();
$my_post[\'ID\'] = $post_id;
$my_post[\'post_title\'] = $post_custom_title;
remove_action(\'acf/save_post\', \'change_title_frontend_albertis\');
wp_update_post( $my_post );
add_action(\'acf/save_post\', \'change_title_frontend_albertis\');
}
}