Reglas de reescritura personalizadas para página de archivo y publicación única

8

Estoy construyendo un sitio de Wordpress con varios tipos de publicaciones personalizadas. Cada tipo de publicación es una revista diferente. También tengo un metacampo personalizado para un año y número de revista.

Me gustaría tener URL (usa archive.php):

http://my_site/magazine/name/
http://my_site/magazine_name/year/
http://my_site/magazine_name/year/issue/

Lo hice por código:

function magazine_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})');
    add_rewrite_tag('%issue%', '([0-9])');
}
add_action('init', 'magazine_rewrite_tag', 10, 0);

y:

function magazine_rewrite_rules() {
    add_rewrite_rule('^([a-z]+)/([0-9]{4})/([0-9])?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');
    add_rewrite_rule('^([a-z]+)/([0-9]{4})?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}
add_action('init', 'magazine_rewrite_rules');

Por supuesto, también tengo consultas personalizadas en archive.php. Y funciona bien.

Pero ahora, mis URL para artículos individuales no funcionan. Por defecto, es:

http://my_site/magazine/post-title

pero muestra todos los artículos de la revista como url (y usó la plantilla archive.php):

http://my_site/magazine/

¿Cómo agregar reglas de reescritura adecuadas para publicaciones personalizadas únicas? Es posible, me gustaría tener URL para publicaciones individuales (solo para los tipos de publicaciones personalizadas elegidas) en este formato:

http://my_site/magazine/year/issue/post-title
Łukasz Florczak
fuente
Notas múltiples: (1) El 4to argumento es el número de argumentos que toma un filtro o acción. Y 10es la prioridad predeterminada . Puede dejar ambos en ese caso ... o probar un número más alto. (2) ¿Ha verificado las reglas de reescritura resultantes? También asegúrese de verificar el orden de esas reglas a medida que se procesan en su orden. Volcar $GLOBALS['wp_rewrite']. (3) ¿Has agregado query_vars que podría entrar en conflicto?
kaiser

Respuestas:

4

¡Encontré la solución! Un complemento Monkeyman Rewrite Analyzur fue muy útil: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

Así que ahora tengo esas URL de trabajo ...

single.php:

/magazine-name/issue-year/issue/article-name

archive.php:

/magazine-name/issue-year/issue
/magazine-name/issue-year
/magazine-name

En una página de editor de publicación personalizada en wp-admin, uso el complemento de Campos personalizados avanzados para el año de emisión y la edición. También puedes definir metacampos por ti mismo.

A continuación, agregué etiquetas de reescritura para el año de emisión y el problema:

function custom_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})' );
    add_rewrite_tag('%issue%', '([0-9]+)' );
}

add_action('init', 'custom_rewrite_tag');

A continuación, agregué las reglas de reescritura de reescritura para cualquier combinación de URL:

function custom_rewrite_rule() {
    // URL: /magazine/year/issue/title
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])/(.?.+?)?(:/([0-9]+))?/?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]&name=$matches[4]', 'top');

    // URL: /magazine/year/issue
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');

    // URL: /magazine/year
    add_rewrite_rule('^([^/]+)/([0-9]{4})?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}

add_action('init', 'custom_rewrite_rule');

Al final, reemplazo las URL estándar por las mías, con el año de emisión y la edición

function custom_permalink($url, $post) {
    if ($post->post_type == 'magazine-name-1' || $post->post_type == 'magazine-name-2' || $post->post_type == 'magazine-name-2' ) {
        global $post;

        $post_type = $post->post_type;
        $issue_year = get_field('issue_year', $post->ID); // ACF; for meta: get_post_meta($post->ID, '$issue', true);
        $issue = get_field('issue', $post->ID); // ACF

        $url = str_replace( $post_type . '/', $post_type . '/' . $issue_year . '/' . $issue . '/' , $url);
    }
    return $url;
}
add_filter('post_type_link', 'custom_permalink', 10, 2);
Łukasz Florczak
fuente