пользовательская постоянная ссылка / короткая ссылка с идентификатором почтового индекса base62

Я хочу, чтобы мои пост-ссылки выглядели как /% post_id62% _% postname% / где% post_id62% – это идентификатор сообщения в кодировке base62 (например, http://example.com/y9Rlf_test/ ), а мои ссылки для ссылок состоят из /% Только post_id62% (например, http://example.com/y9Rlf ). Это то, что у меня есть до сих пор (в моих functions.php ), который явно не работает:

 add_action( 'init', 'yoyo_init' ); function yoyo_init() { add_rewrite_tag( '%post_id62%', '([A-Za-z0-9]+)' ); } add_action('generate_rewrite_rules','yoyo_generate_rewrite_rules'); function yoyo_generate_rewrite_rules($yoyo_rewrite) { global $wp_rewrite; $new_rules['/([0-9A-Za-z]+)/?$'] = 'index.php?p=' . base622dec($wp_rewrite->preg_index(1)); // DOESNT WORK OF COURSE (executed only once when rewrite_rules are generated) $wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules); } add_filter( 'post_link', 'yoyo_post_link', 10, 2 ); function yoyo_post_link( $permalink, $post ) { if ( false !== strpos( $permalink, '%post_id62%' ) ) { $post_id62 = dec2base62( $post->ID ); $permalink = str_replace( '%post_id62%', $post_id62, $permalink ); } return $permalink; } add_filter('pre_get_shortlink', 'yoyo_custom_shortlink', 10, 4); function yoyo_custom_shortlink($false, $post_id, $context, $allow_slugs) { global $wp_query; if($post_id or ($context == 'query' and $post_id = $wp_query->get_queried_object_id())) { return home_url('/' . dec2base62($post_id)); } return false; } function dec2base62($number) { $digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $string = ''; while($number > 0) { $string = $digits[$number % 62] . $string; $number = floor($number / 62); } return $string; } function base622dec($string) { $digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $number = 0; while(strlen($string) and ($number *= 62 or strlen($string))) { $number += strpos($digits, $string[0]); $string = substr($string, 1); } return $number; } 

Есть идеи, как решить проблему? Бонусные баллы за исключение суффикса -N slug, когда есть еще одна публикация с тем же заголовком (чего можно было бы избежать при настройке структуры ссылок на «/% post_id62% _% postname% /», но для того, чтобы иметь функциональность короткой ссылки, должно быть «/% post_id62%» Я думаю, ср. Отключить% postname% auto-incrementing? )! Благодаря!

Solutions Collecting From Web of "пользовательская постоянная ссылка / короткая ссылка с идентификатором почтового индекса base62"

Вы только сделали ошибку на последнем шаге, когда вы конвертируете base62-encoded ID обратно в десятичный идентификатор. Вы не должны этого делать, изменяя правила перезаписи, поскольку они представляют собой только шаблоны, а не фактические правила для каждого сообщения.

Вы хотите получить входящий URL-адрес, чтобы WordPress проанализировал его с помощью правил перезаписи, но затем, прежде чем он будет передан механизму запроса, проверьте переменную post_id62 и установите фактическую переменную p (post id) на ее основе. Вы можете сделать это в фильтре request , который применяется в WP::parse_request() .

 add_action( 'request', 'wpse22253_request' ); function wpse22253_request( $query_vars ) { if ( array_key_exists( 'post_id62', $query_vars ) ) { $query_vars['p'] = base622dec( $query_vars['post_id62'] ); } return $query_vars; } 

Однако это не решит проблему postname-N . WordPress все равно вызовет wp_unique_post_slug в поле post_name , а post_name не будет включать часть post_id62 (поскольку база данных не зависит от правил перезаписи). Как предложил Майк в последующих комментариях к его ответу , вы должны либо выяснить способ включения части post_name поле post_name , либо (и это может быть лучшим способом) игнорировать %postname% в URL и просто пощечины строка конца с именем -name-stripped-number-suffix в конце.

Вы также столкнетесь с проблемами с вашими shortlinks, поскольку они имеют одинаковый формат (любую букву или цифру) в качестве страницы. Is /banana/ a страница с названием «Банан» или ссылка на сообщение с ID 34440682410 – что является banana в кодировке base-62?