it-swarm.com.de

Permalinks in benutzerdefinierten Beitragstypen

Kann ein benutzerdefinierter Beitragstyp einen Permalink als domain.com/custom-slug/ anstelle von domain.com/custom/custom-slug/ haben?

Ich kann es scheinbar nicht erreichen. Argument rewrite bei der Registrierung wird entweder standardmäßig das letztere oder ein benutzerdefiniertes Argument verwendet, indem 'rewrite' => array( 'slug' => 'blah-blah' ) verwendet wird

2
Ashfame

Schauen Sie sich meine Antwort auf die folgende Frage an. Sie können meine parse_request() ändern, um das zu erhalten, was Sie benötigen:

Im Folgenden erfahren Sie, warum das, was Sie möchten, in WordPress Probleme verursachen kann und eine komplexe Lösung erfordert:

AKTUALISIEREN

Aufgrund des Kommentars habe ich beschlossen, dies als nächste Überarbeitung des Plugins zu implementieren. Es wurde wirklich nur für den Anwendungsfall für diese Frage und die Frage aus der zuvor genannten Frage getestet. Im Laufe der Zeit plane ich, es für alle potenziellen Anwendungsfälle zu implementieren, da Fragen oder Kunden auftreten, um die Nachfrage anzutreiben.

Hier ist der Code, den Sie in die Datei functions.php Ihres Themas einfügen würden, um sie für den post_type 'custom' einzurichten:

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

Und hier ist das Plugin, das du in /wp-content/mu-plugins/ platzieren kannst:

<?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

So entfernen Sie den Slug vollständig, sodass die URL-Struktur wie folgt aussieht:

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

in deinem register_post_type set

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

hoffe das hilft

0
Bainternet

Obwohl es seit 2 Jahren nicht mehr aktualisiert wurde, hat das folgende Plugin für mich funktioniert: http://wordpress.org/plugins/remove-slug-from-custom-post-type/

Zu Ihrer Information Ich führe WP 3.9.1 mit WP Typen 1.5.7 aus

0
Max