custom-post-types – Eliminar la barra de taxonomía de un enlace permanente de taxonomía jerárquica personalizada

Pregunta:

Creé una taxonomía de 'foro', usando estas reglas:

register_taxonomy(
  'forum',
  array('topic'),
  array(
    'public' => true,
    'name' => _a('Forums'),
    'singular_name' => _a('Forum'),
    'show_ui' => true,
    'show_in_nav_menus' => true,
    'hierarchical' => true,

    'labels' => array(
      'name' => _a('Forums'),
      'singular_name' => _a('Forum'),
      'search_items' => _a('Search Forums'),
      'popular_items' => _a('Popular Forums'),
      'all_items' => _a('All Forums'),
      'parent_item' => _a('Parent Forum'),
      'parent_item_colon' => _a('Parent Forum:'),
      'edit_item' => _a('Edit Forum'),
      'update_item' => _a('Update Forum'),
      'add_new_item' => _a('Add New Forum'),
      'new_item_name' => _a('New Forum Name'),
    ),
    'query_var' => true,
    'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),  
  )
);

En el front-end, las URL se ven así:

forums/general-discussion/sub-forum

¿Cómo puedo eliminar la barra frontal ("foros")? Es decir, cambie las URL a:

general-discussion/sub-forum

Si paso un argumento slug vacío a register_taxonomy (), funciona, pero eso causa problemas con los enlaces permanentes del tipo de publicación asociado con esta taxonomía

Respuesta:

ACTUALIZAR

Desde que escribí este núcleo de WordPress, se agregó el gancho 'do_parse_request' que permite que el enrutamiento de URL se maneje con elegancia y sin la necesidad de extender la clase WP . Cubrí el tema en profundidad en mi charla de WordCamp de Atlanta de 2014 titulada " Enrutamiento de URL incondicional " ; las diapositivas están disponibles en el enlace.

RESPUESTA ORIGINAL

El diseño de URL ha sido importante durante más de una década; Incluso escribí un blog al respecto hace varios años. Y aunque WordPress es un software brillante, desafortunadamente , su sistema de reescritura de URL está muy cerca de muerte cerebral (en mi humilde opinión, por supuesto. 🙂 De todos modos, ¡me alegra ver que la gente se preocupa por el diseño de URL!

La respuesta que voy a proporcionar es un complemento que llamo WP_Extended que es una prueba de concepto para esta propuesta en Trac (tenga en cuenta que la propuesta comenzó como una cosa y evolucionó a otra, por lo que debe leerla completa para ver adonde se dirigía.)

Básicamente, la idea es parse_request() subclase de la clase WP , anular el método parse_request() y luego asignar la variable global $wp con una instancia de la subclase. Luego, dentro de parse_request() , en realidad inspecciona la ruta por segmento de ruta en lugar de usar una lista de expresiones regulares que deben coincidir con la URL en su totalidad.

Entonces, para parse_request() explícitamente, esta técnica inserta lógica delante de parse_request() que verifica las parse_request() de URL a RegEx y, en cambio, primero busca coincidencias de términos de taxonomía, pero SOLO reemplaza parse_request() y deja el resto completo de WordPress El sistema de enrutamiento de URL está intacto, incluido y especialmente el uso de la variable $query_vars .

Para su caso de uso, esta implementación solo compara segmentos de ruta de URL con términos de taxonomía, ya que eso es todo lo que necesita. Esta implementación inspecciona los términos de la taxonomía respetando las relaciones de términos padre-hijo y, cuando encuentra una coincidencia, asigna la ruta de la URL (menos barras inclinadas al $wp->query_vars['category_name'] y al final) a $wp->query_vars['category_name'] , $wp->query_vars['tag'] o $wp->query_vars['taxonomy'] & $wp->query_vars['term'] y omite el método parse_request() de la clase WP .

Por otro lado, si la ruta de la URL no coincide con un término de una taxonomía que ha especificado, delega la lógica de enrutamiento de URL al sistema de reescritura de WordPress llamando al método parse_request() de la clase WP .

Para utilizar WP_Extended para su uso de los casos tendrá que llamar a la register_url_route() la función desde dentro de su tema functions.php archivo de este modo:

add_action('init','init_forum_url_route');
function init_forum_url_route() {
  register_url_route(array('taxonomy'=>'forum'));
}

¿Cuál es el código fuente del complemento?

<?php
/*
Filename: wp-extended.php
Plugin Name: WP Extended for Taxonomy URL Routes
Author: Mike Schinkel
*/
function register_url_route($args=array()) {
  if (isset($args['taxonomy']))
    WP_Extended::register_taxonomy_url($args['taxonomy']);
}
class WP_Extended extends WP {
  static $taxonomies = array();
  static function on_load() {
    add_action('setup_theme',array(__CLASS__,'setup_theme'));
  }
  static function register_taxonomy_url($taxonomy) {
    self::$taxonomies[$taxonomy] = get_taxonomy($taxonomy);
  }
  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);
$root_path = $_SERVER['HTTP_HOST'];

    if (substr($path,0,strlen($root_path))==$root_path)
      $path = substr($path,strlen($root_path));
    list($path) = explode('?',$path);
    $path_segments = explode('/',trim($path,'/'));
    $taxonomy_term = array();
    $parent_id = 0;
    foreach(self::$taxonomies 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_segments[$segment_index]) {
            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
            }
            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;
      }
    } else {
      parent::parse_request($extra_query_vars); // Delegate to WP class
    }
  }
}
WP_Extended::on_load();

PS AVISO # 1

Aunque para un sitio determinado, creo que esta técnica funciona de manera brillante, pero esta técnica NUNCA debe usarse para que un complemento se distribuya en WordPress.org para que otros lo usen . Si está en el núcleo de un paquete de software basado en WordPress, entonces podría estar bien. De lo contrario, esta técnica debería limitarse a mejorar el enrutamiento de URL para un sitio específico .

¿Por qué? Porque solo un complemento puede usar esta técnica . Si dos complementos intentan usarlo, entrarán en conflicto entre sí.

Además, esta estrategia se puede expandir para manejar de manera genérica prácticamente todos los patrones de casos de uso que podrían ser necesarios y eso es lo que pretendo implementar tan pronto como encuentre el tiempo libre o un cliente que pueda patrocinar el tiempo que se necesitaría para construir implementaciones completamente genéricas.

AVISO # 2

Escribí esto para anular parse_request() que es una función muy grande, y es muy posible que me haya perdido una propiedad o dos del objeto global $wp que debería haber establecido. Entonces, si algo no funciona bien, avíseme y Estaré encantado de investigarlo y revisar la respuesta si es necesario.

De todos modos…

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım