ashfame
  • 0
Гуру

Постоянные ссылки в пользовательских типах записей

  • 0

Возможно ли, чтобы пользовательский тип сообщения имел постоянную ссылку как domain.com/custom-slug/ вместо domain.com/custom/custom-slug/ ?

Кажется, я не могу этого достичь. rewrite аргумент при его регистрации либо по умолчанию используется последний, либо настраивается с помощью'rewrite' => array( 'slug' => 'blah-blah' )

Share
  1. под «custom-slug» вы подразумеваете слаг сообщения?

    • 0
  2. Взгляните на мой ответ на следующий вопрос. Вы можете изменить my parse_request(), чтобы получить то, что вам нужно:

    И вы можете прочитать следующее, чтобы понять, почему то, что вы хотите, может вызвать проблемы в WordPress и требует сложного решения:

    ОБНОВИТЬ

    Основываясь на комментарии, я решил продолжить и реализовать это как следующую версию плагина. Это действительно проверено только для варианта использования для этого вопроса и для вопроса из предыдущего упомянутого вопроса. Со временем я планирую внедрить его для всех потенциальных вариантов использования, поскольку возникают вопросы или клиенты, которые будут стимулировать спрос.

    Вот код, который вы должны поместить в файл functions.php вашей темы, чтобы настроить его для 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));
    }
    

    И вот плагин, который вы можете разместить в /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();
    
    • 0
  3. Чтобы полностью удалить слаг, чтобы структура URL выглядела так:

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

    в вашем наборе register_post_type

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

    надеюсь это поможет

    • 0
  4. Хотя он не обновлялся в течение 2 лет, у меня работал следующий плагин: http://wordpress.org/plugins/remove-slug-from-custom-post-type/

    К вашему сведению, я использую WP 3.9.1 с типами WP.1.5.7

    • 0

Оставить ответ

You must login to add an answer.