如何通过ADD_REWRITE_RULE()使用自定义字段?

时间:2017-04-11 作者:ktbee

我对在WordPress中编写重写规则很陌生,我想确保我没有走错方向。

My goal: 使用随机数字和字母作为自定义帖子类型的URL结尾project 页码

我下面的代码是我迄今为止所尝试的。。。

功能。php

// Create a random string and save it to the post for the URL ending
add_action(\'save_post\',\'add_url_id\');
function add_url_id( $id, $post ){
  $url_id = uniqid();

  if ( isset( $post->url_id ) ) {
    return;
  }
update_post_meta($id, \'url_id\', $url_id );
}

// Let WordPress know about my custom query variable url_id
add_filter( \'query_vars\', \'add_query_var\' );
function add_query_var( $vars )
{
  $vars[] = \'url_id\';
  return $vars;
}

// My rewrite rule to search for the custom post with the URL\'s same url_id
add_action(\'init\', \'custom_rewrite_rule\', 10, 0);    
function custom_rewrite_rule() {
  add_rewrite_rule(
    \'^projects/([0-9a-z]+)/?\',
    \'index.php?post_type=project&url_id=$matches[1]\',
    \'top\');
}
当我var_dump 我在个人自定义贴子页面上的帖子,我可以看到它们的确有价值url_id 领域当我保存此代码并刷新permalinks缓存时,我发现我被重定向到http://example.com/projects/<string of numbers and letters>, 但我只看到了主页,没有看到自定义帖子。我猜问题与我的url_id 变量,但我不确定为什么我的查询没有任何结果,因为我确实有填充了此字段的帖子。

Edit:

这就是我目前在重写分析器插件中看到的rewrite results

我也没有发现我的URL现在正在被重写,所以我没有像我预期的那样。

2 个回复
最合适的回答,由SO网友:ktbee 整理而成

根据TomJ Nowell的反馈,我最终选择了另一条路线,即作为重写规则的一部分,我需要一个昂贵的元查询。我最终改变了帖子的slug本身,这使我可以使用WordPress的默认功能,而无需任何复杂的重写规则。这是我的代码:

add_action(\'wp_insert_post_data\',\'add_url_id\', 50, 2);
function add_url_id( $post_data ){
  // Only set the random slug once and only for published posts
  $original_slug = sanitize_title( $post_data[\'post_title\'] );
  if ( $post_data[\'post_name\'] != $original_slug || $post_data[\'post_status\'] != \'publish\' ) {
    return;
  }

  // Generate random string
  $caps_letters = \'\';
  $caps_letters_len = 6;
  for ($i = 0; $i < $caps_letters_len; $i++) {
    $caps_letters .= chr( rand(65, 90) );
  }

  $numbers_and_lowercase = uniqid();
  $slug_length = strlen($caps_letters) + strlen($numbers_and_lowercase);
  $random_slug = \'\';
  for ($i = 0; $i < $slug_length; $i++) {
    if ( $i % 2 == 0 ) {
      $random_slug .= $numbers_and_lowercase[0];
      $numbers_and_lowercase = substr($numbers_and_lowercase, 1);
    } else {
      $random_slug .= $caps_letters[0];
      $caps_letters = substr($caps_letters, 1);
    }
  }

  $post_data[\'post_name\'] = $random_slug;
  return $post_data;
}
谢谢大家在这方面的帮助!现在我的帖子有随机的URL结尾,这是我最初的目标。

SO网友:Akhilesh29989

您应该使用“post\\u type\\u link”挂钩,并使用(\'with\\u front=>true)参数注册post类型“project”

 \'rewrite\' => array(\'slug\' => $slug, "with_front" => true),   
===============================或=====================================

add_rewrite_rule(\'^project/([0-9a-z]+)/?$\', \'index.php?project=$matches[1]\', \'top\');
====================================================================

  function post_type_link_hook($link, $post) {
    add_rewrite_tag(\'%url_id%\',\'([^&]+)\');
    if (\'projects\' == get_post_type($post)) {
        $urlId = get_post_meta($post->ID, \'url_id\', true);

        //Lets go to get the parent cartoon-series name
        return str_replace(\'%url_id%\', $urlId, $link);
    }
    return $link;
   }
 add_filter(\'post_type_link\', \'post_type_link_hook\', 10, 2);

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: