我对在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:
这就是我目前在重写分析器插件中看到的
我也没有发现我的URL现在正在被重写,所以我没有像我预期的那样。
最合适的回答,由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);