Estructura de enlace permanente personalizada para múltiples URL post_type personalizadas usando add_permastruct que devuelve el error de publicaciones regulares / 404

5 minutos de lectura

el avatar de usuario de theKing
el rey

En mi WP v6.1, tengo dos tipos de puertos personalizados: company, product y taxonomía personalizada country.

La estructura de URL deseada es %country%/%company_postname% y %country%/%product_postname% respectivamente y debajo está el código para $wp_rewrite:

add_action('init', 'custom_init');

function custom_init() {

global $wp_rewrite;
$company_url="/%country%/%company_postname%";
$product_url="/%country%/%product_postname%";

$wp_rewrite->add_permastruct('company', $company_url, false);
$wp_rewrite->add_permastruct('product', $product_url, false);

$wp_rewrite->add_rewrite_tag("%company_postname%", '([^/]+)', "company=");
$wp_rewrite->add_rewrite_tag("%product_postname%", '([^/]+)', "product=");
}

Con el código anterior y otro post_type_link función de filtro, puedo generar mis URL personalizadas. Sin embargo, el problema es regular. post y page las publicaciones no se encuentran regresando error_404.

Estructura de URL estándar de publicación / página regular: www.example.com/%postname%

He intentado add_permastruct para publicaciones y páginas, pero eso no funcionó. ¿Cómo muestro páginas y publicaciones mientras tengo las URL personalizadas para mis publicaciones personalizadas?

Actualización 1
Las publicaciones personalizadas y las taxonomías se crearon mediante código.

Ejemplo de company código

function company_post_type() {

    $labels = array(
        'name' => _x('Company', 'Post Type General Name', 'text'),
    );
    $args = array(
        'labels' => $labels,
        'supports' => array('title', 'editor', 'custom-fields'),
        'taxonomies' => array('country'),
        'query_var' => true,
        'rewrite' => false
    );
    register_post_type('company', $args);
}

add_action('init', 'company_post_type', 0);

Actualización 2

Y mi post_type_link función es:

function post_type_link_function($url, $post) {

    // only if post is published
    if ('' != $url && !in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {

        // get country terms
        $terms = wp_get_object_terms($post->ID, 'country');

        // country
        if (strpos($url, '%country%') !== FALSE) {
            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
                $country = urlencode($terms[0]->slug);
                $url = str_replace('%country%', $country, $url);
            }
        }

        // post names
        $postnames = array('%company_postname%', '%product_postname%', '%postname%');
        foreach ($postnames as $postname) {
            $postname = $post->post_name;
            $url = str_replace($postnames, $postname, $url);
        }

        return $url;
    }

    return $url;
}

Actualización 3

Cuando los enlaces permanentes se establecen en Normal www.example.com/?p=123todas las publicaciones, páginas y publicaciones personalizadas se están cargando bien.

Actualización 4

He observado que las publicaciones y las páginas tampoco están usando single.php o page.php modelo. esta usando index.php. Considerando que no he adjuntado ninguna plantilla a estas páginas o publicaciones.

Actualización 5 – resuelta

se debió a la 'rewrite' => array('slug' => "https://stackoverflow.com/", 'with_front' => FALSE) en el country taxonomía personalizada. Sin esto rewrite ahora las paginas y las publicaciones estan bien.

  • ¿Cómo creaste una publicación personalizada?[company, product] (a través de un complemento o su propio código)?

    – json

    10 de diciembre a las 7:17


  • Por código propio, vea mi pregunta actualizada por favor.

    – el rey

    10 de diciembre a las 14:52

  • ¿Y cuál es su “otra función de filtro post_type_link”?

    – Alexis Vandepitte

    11 dic a las 13:23

  • post_type_link actualización de la función en la pregunta.

    – el rey

    13 dic a las 13:02

Avatar de usuario de Moishy
húmedo

Puedes usar el post_type_link gancho.

Agregue su tipo de publicación personalizada y taxonomía con su reescritura personalizada:

function company_post_type() {
    
    $labels = array(
        'name' => _x('Company', 'Post Type General Name', 'text'),
    );
    
    $args = array(
        'labels' => $labels,
        'show_ui' => true,
        'public' => true,
        'publicly_queryable' => true,
        'supports' => array('title', 'editor', 'custom-fields'),
        'taxonomies' => array('country'),
        'query_var' => true,
        'rewrite' => array( 'slug' => '%country%', 'with_front' => false ),
    );
    
    register_post_type('company', $args);
    
    
    $tax_args = array(
        'hierarchical'      => true,
        'public'            => true,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'show_in_rest'      => true,
    );

    register_taxonomy( 'country', 'company', $tax_args );

}
    
add_action('init', 'company_post_type', 0);

luego ejecutamos un reemplazo en el enlace permanente a través del gancho:

function replace_post_link( $post_link, $id = 0 ){
    $post = get_post($id);
    $post_type = get_post_type( $id );
    if ( is_object( $post ) && $post_type == 'company'){
        
        $cat="country";
        
        $terms = wp_get_object_terms( $post->ID, $cat );
        if( $terms && !is_wp_error($terms) ){
            return str_replace( '%country%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;  
}
add_filter( 'post_type_link', 'replace_post_link', 1, 3 );

ACTUALIZAR:

Parece haber una peculiaridad con wordpress al usar esta sintaxis para su reescritura, por lo que deberá anteponer el término con un frente.

'rewrite' => array( 'slug' => 'country/%country%', 'with_front' => false )

y en el enlace de la publicación de reemplazo:

return str_replace( 'country/%country%', $terms[0]->slug , $post_link );

Entonces tu URL será:

country/%country%/%company_postname%

asegúrese de vaciar sus reglas de reescritura cuando haya terminado yendo a: Configuración> Enlaces permanentes y haciendo clic en ‘guardar cambios’

  • Mis URL de tipo de publicación personalizada están bien. Tengo problemas con el valor predeterminado post solo, quería tener la estructura de URL como www.example.com/%postname% mientras tiene las estructuras de URL personalizadas anteriores para publicaciones de tipo personalizado.

    – el rey

    13 de diciembre a las 12:58

  • Parece ser una extraña peculiaridad de wordpress. deberá agregar un frente al término. Actualizare mi respuesta

    – húmedo

    13 de diciembre a las 16:34

  • Con o sin 'with_front' => false, las URL de mis publicaciones personalizadas funcionan bien. El único problema es con el valor predeterminado. post publicaciones, que devuelve 404 / página no encontrada.

    – el rey

    14 de diciembre a las 23:15

  • Correcto. Lea mi respuesta actualizada. Es una peculiaridad en WordPress. La única forma de evitarlo es agregar un frente a la URL del tipo de publicación personalizada y las publicaciones funcionarán bien

    – húmedo

    14 dic a las 23:32

  • Eso hace que mis URL de publicaciones personalizadas country/%country%/%company_postname% en vez de /%country%/%company_postname%con o sin with_front. Y las publicaciones siguen siendo 404.

    – el rey

    15 de diciembre a las 0:02

¿Ha sido útil esta solución?