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' )
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:
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();
Pour supprimer complètement le slug afin que la structure de l'URL ressemble à ceci:
dans votre ensemble register_post_type
'rewrite' => array('slug' => false, 'with_front' => false)
j'espère que cela t'aides
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