【问题标题】:Customize the auto generation of Post Slug in Wordpress自定义 Wordpress 中 Post Slug 的自动生成
【发布时间】:2010-12-23 11:56:08
【问题描述】:

当我们在 wordpress 中添加新帖子时,在提供帖子标题后,会自动生成 slug。我需要编辑该自动生成模块,以便我可以在 slug 的末尾自动添加一些任意数字。怎么做?

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    不要使用 OP 在这里使用的硬编码版本。当他这样做时,没有可用的过滤器。最近,从 3.3 开始,添加了一个过滤器。

    add_filter( 'wp_unique_post_slug', 'custom_unique_post_slug', 10, 4 );
    function custom_unique_post_slug( $slug, $post_ID, $post_status, $post_type ) {
        if ( $custom_post_type == $post_type ) {
            $slug = md5( time() );
        }
        return $slug;
    }
    

    但是,每次保存帖子时,这种方法都会改变 slug...这正是我所希望的...

    编辑:

    这种方法用于将生成限制为一次。唯一的缺点是它会在创建标题后运行 ajax 时创建一个版本,然后在保存帖子时创建另一个永久 slug。

    function custom_unique_post_slug( $slug, $post_ID, $post_status, $post_type ) {
        if ( $custom_post_type == $post_type ) {
            $post = get_post($post_ID);
            if ( empty($post->post_name) || $slug != $post->post_name ) {
                $slug = md5( time() );
            }
        }
        return $slug;
    }
    

    【讨论】:

      【解决方案2】:

      编写一个插件来挂钩wp_insert_post_data 过滤器,这样您就可以在将帖子发送到数据库之前更新 slug:

      function append_slug($data) {
          global $post_ID;
      
          if (empty($data['post_name'])) {
              $data['post_name'] = sanitize_title($data['post_title'], $post_ID);
              $data['post_name'] .= '-' . generate_arbitrary_number_here();
          }
      
          return $data;
      }
      
      add_filter('wp_insert_post_data', 'append_slug', 10);
      

      请注意,此功能要求您首先允许 WordPress 自动生成 slug,这意味着您在生成之前不能输入自己的 slug,并且它无法使用该编号更新现有帖子。

      【讨论】:

      • 好的。你能解释一下这里的控制流程吗?我正在添加一个过滤器,这意味着当函数wp_insert_post_data 被调用时,它必须通过我定义的函数,即append_slug,对吗? add_filter 的第三个参数(即10)有什么作用?
      • @Bibhas:在 WordPress 完成生成 post slug 后,它会立即调用适用于 wp_insert_post_data 过滤器的所有函数(它实际上并不是 PHP 函数本身)。 WordPress 根据正在更新的帖子传递$data$postarr,因此您可以访问$data['post_name'](蛞蝓)。修改 slug 和 return $data 后,WordPress 将拥有更新的帖子数据,准备好在数据库中插入或更新。只需将其设为插件,激活它,WordPress 将自动处理其余部分。我相信每次保存帖子时都会调用此过滤器。
      • 顺便说一句,那个10 .. 它有什么作用?
      • 10 只是一个任意值,用于告诉 WordPress 何时调用此过滤器函数,如果有其他任何东西与该函数挂钩。在你的情况下应该没那么重要。
      • 发生此错误 - Missing argument 2 for append_slug()
      【解决方案3】:

      对此进行测试:(将其粘贴到functions.php中)

      function append_slug($data) {
      global $post_ID;
      
      if (!empty($data['post_name']) && $data['post_status'] == "publish" && $data['post_type'] == "post") {
      
              if( !is_numeric(substr($data['post_name'], -4)) ) {
                  $random = rand(1111,9999);
                  $data['post_name'] = sanitize_title($data['post_title'], $post_ID);
                  $data['post_name'] .= '-' . $random;
              }
      
      }
       return $data; } add_filter('wp_insert_post_data', 'append_slug', 10);
      

      【讨论】:

        【解决方案4】:
           add_filter('post_link','postLinkFilter', 10, 3);
        
           /**
            * Manipulates the permalink
            *
            * @param string $permalink
            * @param stdClass $post
            * @return string
            */
           function postLinkFilter($permalink,stdClass $post){
                return $permalink.'?12345';
           }
        

        在那种情况下未经测试,但我已经使用过它,应该进行最少的更改,但请尝试并认真测试它。

        无论如何,不​​要在这里使用rand()或类似的东西,因为该函数每次都必须为同一个帖子返回相同的链接,否则你会遇到一些严重的问题。

        玩得开心!

        【讨论】:

        • 其实我希望它生成随机数并像这样存储slug。
        • 啊,所以你想操纵帖子的帖子名称,而不是直接操作 slug 创建过程,在这种情况下使用@BoltClock,但请确保检查那是插入还是更新,否则您每次更新文章时都会附加另一个随机数-我确定您不想这样做;)
        • 感谢您的建议。 :)
        • @Bidhas 不要提及它,可能可以检查$postarr 是否已经有ID - 但我不是 100% 的人
        • 检查。如果有的话会发布。
        【解决方案5】:

        您应该使用wp_ajax_sample-permalink actionname_save_pre filter 进行操作。

        更多示例:https://wordpress.stackexchange.com/a/190314/42702

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-06
          • 2017-01-31
          • 2017-07-13
          • 2021-02-22
          • 1970-01-01
          • 2020-10-02
          相关资源
          最近更新 更多