Actualmente estoy tratando de generar una lista de títulos de música y me gustaría que la clasificación ignore (pero aún muestre) el artículo inicial del título.
Por ejemplo, si tuviera una lista de bandas, se mostrará alfabéticamente en WordPress así:
- Sábado negro
- Led Zeppelin
- Pink Floyd
- Los Beatles
- Los torceduras
- Los Rolling Stones
- Delgado lizzy
En cambio, me gustaría que se muestre alfabéticamente mientras se ignora el artículo inicial 'The', así:
- Los Beatles
- Sábado negro
- Los torceduras
- Led Zeppelin
- Pink Floyd
- Los Rolling Stones
- Delgado lizzy
Encontré una solución en una entrada de blog del año pasado , que sugiere el siguiente código en functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = 'The';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( '^($matches)[[:space:]]' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( '/^(\s+)?,/', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
y luego ajustando la consulta con add_filter
antes yremove_filter
después.
He intentado esto, pero sigo recibiendo el siguiente error en mi sitio:
Error de la base de datos de WordPress: [columna desconocida 'título2' en 'cláusula de pedido']
SELECCIONE wp_posts. * DESDE wp_posts DONDE 1 = 1 Y wp_posts.post_type = 'release' AND (wp_posts.post_status = 'publicar' O wp_posts.post_status = 'privado') ORDEN POR SUPERIOR (título2) ASC
No voy a mentir, soy bastante nuevo en la parte php de WordPress, así que no estoy seguro de por qué recibo este error. Puedo ver que tiene algo que ver con la columna 'título2', pero entendí que la primera función debería ocuparse de eso. Además, si hay una forma más inteligente de hacer esto, soy todo oídos. He estado buscando y buscando en este sitio, pero realmente no he encontrado muchas soluciones.
Mi código usando los filtros se ve así si es de alguna ayuda:
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>
Respuestas:
El problema
Creo que hay un error tipográfico allí:
El nombre del filtro
posts_fields
no espost_fields
.Eso podría explicar por qué el
title2
campo es desconocido, porque su definición no se agrega a la cadena SQL generada.Alternativa: filtro único
Podemos reescribirlo para usar un solo filtro:
donde ahora puede activar el pedido personalizado con el
_custom
parámetro orderby:Alternativa: recursiva
TRIM()
Pongamos en práctica la idea recursiva de Pascal Birchler , comentada aquí :
donde podemos, por ejemplo, construir la función recursiva como:
Esto significa que
Generará:
Alternativa - MariaDB
En general, me gusta usar MariaDB en lugar de MySQL . Entonces es mucho más fácil porque MariaDB 10.0.5 admite
REGEXP_REPLACE
:fuente
functions.php
y llamarloorderby
cuando lo necesite. Gran solución - gracias :-)Una forma más fácil puede ser revisar y cambiar el enlace permanente de las publicaciones que lo necesitan (debajo del título en la pantalla de escritura de publicaciones) y luego usarlo para ordenar en lugar del título.
es decir.
post_name
no usarpost_title
para clasificar ...Esto también significaría que su enlace permanente puede ser diferente si usa% postname% en su estructura de enlace permanente, lo que podría ser una ventaja adicional.
p.ej.
http://example.com/rolling-stones/
no dahttp://example.com/the-rolling-stones/
EDITAR : código para actualizar las babosas existentes, eliminando los prefijos no deseados de la
post_name
columna ...fuente
EDITAR
He mejorado un poco el código. Todos los bloques de código se actualizan en consecuencia. Solo una nota antes de saltar a las actualizaciones en la RESPUESTA ORIGINAL , he configurado el código para que funcione con lo siguiente
Tipo de publicación personalizada ->
release
Taxonomía personalizada ->
game
Asegúrese de configurar esto de acuerdo a sus necesidades
RESPUESTA ORIGINAL
Además de las otras respuestas y el error tipográfico señalado por @birgire, aquí hay otro enfoque.
Primero, estableceremos el título como un campo personalizado oculto, pero primero eliminaremos las palabras
the
que queremos excluir. Antes de hacer eso, primero debemos crear una función auxiliar para eliminar las palabras prohibidas de los nombres de términos y títulos de publicaciones.Ahora que lo tenemos cubierto, veamos el código para establecer nuestro campo personalizado. Debe eliminar este código por completo tan pronto como haya cargado alguna página una vez. Si tiene un sitio enorme con una tonelada de publicaciones, puede configurar
posts_per_page
algo100
y ejecutar los scripts un par de veces hasta que todas las publicaciones tengan el campo personalizado configurado en todas las publicacionesAhora que los campos personalizados están configurados para todas las publicaciones y se elimina el código anterior, debemos asegurarnos de configurar este campo personalizado para todas las publicaciones nuevas o cada vez que actualicemos el título de la publicación. Para esto usaremos el
transition_post_status
gancho. El siguiente código puede ir a un complemento ( que recomiendo ) o en sufunctions.php
CONSULTA TUS PUBLICACIONES
Puede ejecutar sus consultas de forma normal sin ningún filtro personalizado. Puede consultar y ordenar sus publicaciones de la siguiente manera
fuente
Las respuestas de birgire funcionan bien cuando se ordena solo por este campo. Hice algunas modificaciones para que funcione al ordenar por múltiples campos (no estoy seguro de que funcione correctamente cuando el orden de títulos es el principal):
fuente