使用自定义字段而不是原始标题字段,但仅适用于自定义帖子类型

时间:2013-12-17 作者:deadfishli

我正在尝试获取一个自定义字段值(“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”。

如果你们想知道的话,我不能使用常规标题字段,因为它被特别要求使用所有自定义字段。

2 个回复
最合适的回答,由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_ksesvalidation 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\');
    } 
}

结束

相关推荐

Search CPT Title AND Meta

我目前有一个CPT我想搜索,问题是我还需要能够搜索CPT的元数据。我有以下代码,目前搜索所需的元数据,但我似乎无法让它搜索标题和元数据。非常感谢您的帮助!<?php /** * @package WordPress * @subpackage themename */ get_header(); $search = get_search_query(); ?> <div id=\"main\">