web-dev-qa-db-fra.com

lien permanent/court lien personnalisé avec ID de poste codé base62

Je veux que mes post-liens ressemblent à /% post_id62% _% postname%/où% post_id62% est l'ID de publication codé en base62 (par exemple http://example.com/y9Rlf_test/ ) et mes raccourcis se composent uniquement de /% post_id62% (par exemple http://example.com/y9Rlf ). C'est ce que j'ai jusqu'à présent (dans mon functions.php) qui ne fonctionne évidemment pas:

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;
}

Une idée de comment aborder le problème? Points bonus pour éviter le suffixe -N slug lorsqu’une autre publication avec le même titre est créée (ce qui pourrait être évité si vous définissez la structure de lien sur "/% post_id62% _% postname% /" mais pour que la fonctionnalité de lien court devrait être "/% post_id62%" Je suppose; cf. Désactiver% postname% auto-incrémenté? )! Merci!

2
user6254

Vous avez seulement commis une erreur lors de la dernière étape lorsque vous avez reconverti l'ID codé en base62 en ID décimal. Cela ne devrait pas être fait en modifiant les règles de réécriture, car ce ne sont que des modèles, et non des règles réelles par publication.

Ce que vous voulez, c'est prendre une URL entrante, laissez WordPress l'analyser en utilisant les règles de réécriture, mais avant de la transmettre au moteur de requête, recherchez la variable post_id62 et définissez la variable réelle p (post id) en fonction de celle-ci. Vous pouvez le faire dans le filtre request, qui est appliqué dans 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;
}

Cependant, cela ne résoudra pas le problème postname-N. WordPress appelle toujours wp_unique_post_slug dans le champ post_name et post_name n'inclut pas la partie post_id62 (car la base de données est indépendante des règles de réécriture). Comme Mike a suggéré dans les commentaires suivants de sa réponse , vous devez trouver un moyen d'inclure la partie post_id62 dans le champ post_name, ou (et ce peut-être que le meilleur moyen) ignore la partie %postname% de l'URL et claque une chaîne postname-with-stripped-suffix-number à la fin.

Vous rencontrerez également des problèmes avec vos liens courts, car ils ont le même format (toute lettre ou chiffre) comme une page. /banana/ est-il une page portant le titre "Banane" ou un lien direct vers la publication portant le numéro d'identification 34440682410 - dont le nom est banana dans votre codage en base 62?

2
Jan Fabry