发布时将自定义分类术语作为自定义帖子类型的帖子标题

时间:2011-07-10 作者:Sam K

我使用重力表单允许用户从前端创建帖子。

然而,我正在构建的这个网站的工作方式是,一个特定的Post\\u类型本质上只是一个“数据”帖子。有一种特定的分类法,术语实际上是数据集的“标题”。

我已经找到了一种在Gravity表单中隐藏“Title”字段的方法,但它仍然存在于表单中(出于某种原因,他们将“Post\\u Type”和“Post Status”锁定在GUI中的“Title”字段中,因此我重载了它的条件逻辑以强制它始终隐藏)。

我想创建一个过滤器,它总是将特定[分类法]的[术语]值复制到特定[Post\\u类型]的[标题]字段中。

我能得到的任何关于如何实现这一目标的建议都将非常棒!提前感谢!

==============================================================

好的,使用下面@Manny Fleurmond的代码,以及这篇文章:Title_save_pre - Simple problem that u know for sure

我想到了

function taxonomy_title_rename($title) {
    global $post;
    $type = get_post_type($post->ID);
    if ($type== \'CUSTOM_POST_TYPE\') {
            if($post->post_type === \'CUSTOM_POST_TYPE\') {
        $terms = wp_get_object_terms($post->ID, \'MY_TAXONOMY\');
        if(!is_wp_error($terms) && !empty($terms)) {
            $title = $terms[0]->name;
        }
        }
    return $title;
}
     else if ($type != \'CUSTOM_POST_TYPE\') {
       return $title;
    }
    }
    add_filter (\'title_save_pre\',\'taxonomy_title_rename\');
这实际上是将文章标题从分类法保存到文章。然而,它并没有把它也拉到永久链接中,我的永久链接只是帖子ID号。我会看看我是否能自己解决这个问题,但任何帮助都将不胜感激!

3 个回复
最合适的回答,由SO网友:Sam K 整理而成

好吧,因为我基本上是用发布的内容(实际上不起作用)加上一些额外的研究得出了我自己的答案,所以我将结束这个问题,尽管我添加了一个额外的问题;

好的,使用下面@Manny Fleurmond的代码,以及这篇文章:Title\\u save\\u pre-Simple problem,你肯定知道

我想到了

function taxonomy_title_rename($title) {
    global $post;
    $type = get_post_type($post->ID);
    if ($type== \'CUSTOM_POST_TYPE\') {
            if($post->post_type === \'CUSTOM_POST_TYPE\') {
        $terms = wp_get_object_terms($post->ID, \'MY_TAXONOMY\');
        if(!is_wp_error($terms) && !empty($terms)) {
            $title = $terms[0]->name;
        }
        }
    return $title;
}
     else if ($type != \'CUSTOM_POST_TYPE\') {
       return $title;
    }
    }
    add_filter (\'title_save_pre\',\'taxonomy_title_rename\');
这实际上是将文章标题从分类法保存到文章。

SO网友:Manny Fleurmond

我想出了一个解决办法。如果您需要,请告诉我:

add_filter(\'the_title\',\'term_filter\',10,2);
function term_filter($title, $post) {
    $post = get_post($post) ;
    if($post->post_type === \'special_post_type\') {
        $terms = wp_get_object_terms($post->ID, \'taxonomy\');
        if(!is_wp_error($terms) && !empty($terms)) {
            $title = $terms[0]->name;
        }
    }
    return $title;
}
基本上,我对标题使用一个过滤器来检查标题来自哪个帖子类型。如果类型正确,标题将替换为连接到该帖子的分类法的第一个术语。

如果有什么不清楚的地方,请问我任何问题!

SO网友:amarinediary

过滤器知识title_save_pre 在将贴子写入数据库之前,以及在将其任何贴子元保存到数据库之前运行。

wp_get_object_terms 此时将为空白。

要更正此问题,您需要save_post 并从那里更新帖子。save_post 将帖子保存到数据库并保存内置“自定义字段”后运行。

来源@https://wordpress.stackexchange.com/a/54713/190376使用前需要了解一些事情save_post 就像infinite loop case. 总的来说,你非常接近。

演示我已经对所有内容发表了评论。我添加了一些jquery来禁用标题输入,并添加了一个过滤器来更新默认占位符。如果没有选择分类法,我还限制了发布的能力。

<?php
add_action( \'init\', function() {

  /**
  * Determines whether the current request is for an administrative interface page
  * @link https://developer.wordpress.org/reference/functions/is_admin/
  */
  if( ! is_admin() ) {
    return;
  };

  global $custom_taxonomies, $custom_post_type;
  $custom_post_type = \'_custom_post_type_\'; // set your custom post type
  $custom_taxonomies = [ \'_first_custom_taxonomy_\', \'_second_custom_taxonomy_\' ]; // set your custom taxonomies

  /**
  * Disable title input
  * @link https://developer.wordpress.org/reference/hooks/enter_title_here/
  */
  add_action( \'admin_head\', function() {

    global $custom_post_type, $custom_taxonomies;
    if( get_post_type() !== $custom_post_type ) {
      return;
    };

    echo "<script type=\'text/javascript\'>
    jQuery( document ).ready( function( $ ) {
      $( \'#title\' ).css( \'cursor\', \'not-allowed\' ).attr( \'readonly\', true ).attr( \'disabled\', true );

      var term = $( \'input[name^=\\"tax_input\\"]:checkbox\' );
      term.change( function() {
        $( \'#publish, #save-post\' ).prop( \'disabled\', term.filter( \':checked\' ).length < 1 );
      } );
      term.change();
    } ); </script>";
  } );

  /**
  * Replace the default placeholder
  * @link https://developer.wordpress.org/reference/hooks/enter_title_here/
  */
  add_filter( \'enter_title_here\', function( $placeholder ) {

    global $custom_post_type, $custom_taxonomies;
    if( get_post_type() !== $custom_post_type ) {
      return;
    };

    $placeholder = "Title automatically generated";
    return $placeholder;
  } );

  /**
  * Fires once a post has been saved
  * @link https://developer.wordpress.org/reference/hooks/save_post/
  */
  add_action( \'save_post\', \'automatically_generated_title\', 10, 2 );
  function automatically_generated_title( $post_id, $post ) {

    /**
    * Prevent function if custom the post type isn\'t matching
    * ...or if the post is published as auto-draft
    * @link https://wordpress.stackexchange.com/a/218291/190376
    * @link https://wordpress.stackexchange.com/a/217101/190376
    */
    global $custom_post_type, $custom_taxonomies;
    if ( $post->post_type != $custom_post_type || $post->post_status == \'auto-draft\' ) {
      return;
    };

    /**
    * Prevent function on auto save
    * @link https://wordpress.stackexchange.com/a/218291/190376
    */
    if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
      return;
    };

    /**
    * Prevent title from updating on post update
    * @link https://wordpress.stackexchange.com/a/177670/190376
    */
    $created  = new DateTime( $post->post_date_gmt ); // get post publication date
    $modified = new DateTime( $post->post_modified_gmt ); // get post modification date
    $delta = $created->diff( $modified ); // calculate delta between $created and $modified
    $delay = ( ( ( $delta->y * 365.25 + $delta->m * 30 + $delta->d ) * 24 + $delta->h ) * 60 + $delta->i ) * 60 + $delta->s; // handle the processing when it begins at the end of a given second, the post_date_gmt and the post_modified_gmt might be different

    if( $delay <= 1 ) {

      /**
      * wp_get_object_terms instead of get_the_terms to retrieve an array() of taxonomies
      * @link https://developer.wordpress.org/reference/functions/wp_get_object_terms/
      */
      $terms = join( \'\', wp_list_pluck( wp_get_object_terms( $post_id, $custom_taxonomies ), \'name\' ) );
      $self = str_replace( \'-\', \'\', strtoupper( get_post_type() . $terms . $post_id ) ); // set your title structure

      /**
      * Prenvent infinite loop case
      * @link https://developer.wordpress.org/reference/hooks/save_post/#avoiding-infinite-loops
      */
      remove_action( \'save_post\', \'automatically_generated_title\' ); // unhook this function so it doesn\'t loop infinitely

      /**
      * Update a post with new post data
      * @link https://developer.wordpress.org/reference/functions/wp_update_post/
      * Parameters based on wp_insert_post @see https://developer.wordpress.org/reference/functions/wp_insert_post/#parameters
      */
      wp_update_post( array(
        \'ID\' => $post_id,
        \'post_title\' => $self,
        \'post_name\' => $self,
      ) ); // update the post, which calls save_post again

      add_action( \'save_post\', \'automatically_generated_title\', 10, 2 ); // re-hook this function

    };

  };

} ); ?>
标题将在首次发布提交时自动设置。然后,它将忽略对帖子所做的任何更新,以保持一致的slug。通过删除中间的代码,可以轻松地重写该行为if( $delay <= 1 ) { ..., 将其移到语句之外,并删除以下行,包括if( $delay <= 1 ) { ... 自身:

$created  = new DateTime( $post->post_date_gmt );
$modified = new DateTime( $post->post_modified_gmt );
$delta = $created->diff( $modified );
$delay = ( ( ( $delta->y * 365.25 + $delta->m * 30 + $delta->d ) * 24 + $delta->h ) * 60 + $delta->i ) * 60 + $delta->s;

结束

相关推荐

发布类似Site.com/ategory/the-post-title的URL结构

我是新来的wordpress 我想更好地理解是否有可能使用基于category 然后post title, 因此:差不多http://mysite.com/category-name/the-post-title或http://mysite.com/category-name/12345 (帖子id)或http://mysite.com/category-name/12345/the-post-title是否有一些插件可以做到这一点,或者我应该考虑其他方式,如url_rewrite 这样做?