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=123
todas 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.
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 comowww.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 sinwith_front
. Y las publicaciones siguen siendo 404.– el rey
15 de diciembre a las 0:02
¿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