web-dev-qa-db-fra.com

Permaliens dans les types de messages personnalisés

Est-il possible qu'un type de publication personnalisé ait un lien permanent en tant que domain.com/custom-slug/ au lieu de domain.com/custom/custom-slug/?

Je n'arrive pas à y arriver. L'argument rewrite lors de son enregistrement est, par défaut, le dernier ou personnalisé en utilisant 'rewrite' => array( 'slug' => 'blah-blah' )

2
Ashfame

Jetez un oeil à ma réponse à la question suivante. Vous pouvez modifier ma parse_request() pour obtenir ce dont vous avez besoin:

Et vous pouvez lire ce qui suit pour voir pourquoi ce que vous voulez peut causer des problèmes dans WordPress et nécessite une solution complexe:

METTRE À JOUR

Sur la base du commentaire, j'ai décidé d'aller de l'avant et de l'implémenter lors de la prochaine révision du plugin. En réalité, il est uniquement testé pour le cas d'utilisation de cette question et celui de la question précédemment citée . Avec le temps, je prévois de le mettre en œuvre pour tous les cas d'utilisation potentiels, au fur et à mesure que des questions ou des clients se font jour pour stimuler la demande.

Voici le code que vous placeriez dans le fichier functions.php de votre thème pour le configurer pour le post_type 'custom':

add_action('init','init_url_routes');
function init_url_routes() {
  $post_type = 'custom'; // Change this to your actual post_type name
  register_url_route(array('post_type'=>$post_type));
}

Et voici le plugin que vous pouvez placer dans /wp-content/mu-plugins/:

<?php
/*
Filename: wp-extended.php
Plugin Name: WP Extended for Taxonomy URL Routes
Author: Mike Schinkel
Version: 0.2
*/
function register_url_route($args=array()) {
  WP_Extended::register_url_route($args);
}
class WP_Extended extends WP {
  static $root = array();
  static function on_load() {
    add_action('setup_theme',array(__CLASS__,'setup_theme'));
  }
  static function register_url_route($args) {
    if (isset($args['taxonomy']))
      self::$root['taxonomy'][$args['taxonomy']] = get_taxonomy($args['taxonomy']);
    if (isset($args['post_type']))
      self::$root['posts'][$args['post_type']] = get_post_type_object($args['post_type']);
  }
  static function setup_theme() { // Setup theme is 1st code run after WP is created.
    global $wp;
    $wp = new WP_Extended();  // Replace the global $wp
  }
  function parse_request($extra_query_vars = '') {
    $path = $_SERVER['REQUEST_URI'];
    $domain = str_replace('.','\.',$_SERVER['SERVER_NAME']);
    $root_path = preg_replace("#^https?://{$domain}(/.*)$#",'$1',WP_SITEURL);
    if (substr($path,0,strlen($root_path))==$root_path)
      $path = substr($path,strlen($root_path));
    list($path) = explode('?',$path);
    $path_segments = explode('/',trim($path,'/'));
    // This does not handle ordering priority of type to match yet
    $matched = $this->parse_post_type_request($path_segments);
    if (!$matched)
      $matched = $this->parse_taxonomy_request($path_segments);
    if ($matched) {
      // This is hamfisted but necessary in some cases.
      // TODO: Look into ways to have more finesse with this.
      remove_action('template_redirect','redirect_canonical');
    } else {
      parent::parse_request($extra_query_vars); // Delegate to WP class
    }
  }
  function parse_post_type_request($path_segments) {
    // This does not handle heirarchical pages yet
    $post_id = false;
    global $wpdb;
    $sql =<<<SQL
SELECT
  ID
FROM
  {$wpdb->posts}
WHERE 1=1
  AND post_status='publish'
  AND post_type='%s'
  AND post_name='%s'
SQL;
    if (is_array(self::$root['posts'])) {
      foreach(self::$root['posts'] as $post_type => $post_type_object) {
        $sql = $wpdb->prepare($sql,$post_type,$path_segments[0]);
        $post_id = $wpdb->get_var($sql);
        if ($post_id) {
          $this->query_vars[($post_type=='page' ? 'page_id' : 'p')] = $post_id;
          unset($path_segments[0]);  // Remove from future consideration
          break;
        }
      }
    }
    return ($post_id);
  }
  function parse_taxonomy_request($path_segments) {
    $taxonomy_term = array();
    $parent_id = 0;
    if (is_array(self::$root['taxonomy'])) {
      foreach(self::$root['taxonomy'] as $taxonomy_slug => $taxonomy) {
        $terms = get_terms($taxonomy_slug);
        foreach($path_segments as $segment_index => $path_segment) {
          foreach($terms as $term_index => $term) {
            if ($term->slug==$path_segment) {
              if ($term->parent!=$parent_id) { // Make sure we test parents
                $taxonomy_term = array();
              } else {
                $parent_id = $term->term_id; // Capture parent ID for verification
                $taxonomy_term[] = $term->slug; // Collect slug as path segment
                unset($terms[$term_index]); // No need to scan it again
              }
              unset($path_segments[$segment_index]);  // Remove from future consideration
              break;
            }
          }
        }
        if (count($taxonomy_term))
          break;
      }
      if (count($taxonomy_term)) {
        $path = implode('/',$taxonomy_term);
        switch ($taxonomy_slug) {
          case 'category':
            $this->query_vars['category_name'] = $path;
            break;
          case 'post_tag':
            $this->query_vars['tag'] = $path;
            break;
          default:
            $this->query_vars['taxonomy'] = $taxonomy_slug;
            $this->query_vars['term'] = $path;
            break;
        }
      }
    }
    return count($taxonomy_term);
  }
}
WP_Extended::on_load();
2
MikeSchinkel

Pour supprimer complètement le slug afin que la structure de l'URL ressemble à ceci:

http://domain.com/post-slug/

dans votre ensemble register_post_type

'rewrite' => array('slug' => false, 'with_front' => false)

j'espère que cela t'aides

0
Bainternet

Bien qu'il n'ait pas été mis à jour depuis 2 ans, le plugin ci-dessous a fonctionné pour moi: http://wordpress.org/plugins/remove-slug-from-custom-post-type/

FYI j'utilise WP 3.9.1 avec WP Types 1.5.7

0
Max