Problema de clasificación de matriz de etiquetas

6 minutos de lectura

avatar de usuario
Milán

25/10/2012 – ¡Aún no resuelto! Por favor ver más abajo:

Mi cliente tiene una nube de etiquetas de WordPress (matriz de etiquetas) con etiquetas que incluyen [“] carácter así como [The] prefijo para algunas etiquetas. Es decir:

"rose"
"autumn"
The Abby
The Cloud
The Elephant

Obviamente todas las etiquetas entre comillas [“] se ordenan en la parte superior de la lista y todas las palabras que comienzan con [The] prefijo están ordenados en algún lugar alrededor de la letra [T] (siguiendo el orden lógico ASC).

Me rociaron que: “Todas las etiquetas (en la nube de etiquetas de WP) deben ordenarse Ascendentemente, pero aquellas que contienen el [” “] o [The] los caracteres deben ordenarse con todas las demás etiquetas en orden cronológico, ignorando el [“] y [The] prefijo.

Investigué la función principal de WP:

**function wp_generate_tag_cloud**

pero no tengo ni idea de por donde empezar. En la instrucción SQL sin procesar, probablemente podría usar trim() para filtrar el [” “] y [The] los caracteres forman la matriz de la nube de etiquetas, pero eso es solo un pensamiento que no tengo idea de cómo aplicar.

  • ¿Quieres ordenarlos en MySQL o PHP?

    – Jacobo

    24 de octubre de 2012 a las 2:26

  • Supongo que de cualquier manera está bien siempre que pueda conectarlo al WP [wp_generate_tag_cloud] función básica. La pregunta no es cómo hacer que la consulta de MySQL ignore los caracteres seleccionados y, en consecuencia, ordenarlos (ORDENAR POR) ASC, el problema es cómo integrar “cualquier” buena solución en la plataforma WP. Gracias.

    – Milán

    24 de octubre de 2012 a las 4:01

  • ¿No podría simplemente actualizar la tabla de la base de datos y eliminar tanto las citas como el artículo? Luego, ¿agregar algo como un filtro en el formulario de etiqueta para eliminar estas cosas para las etiquetas recién creadas?

    – Vadim Ashikhman

    26/10/2012 a las 19:42


  • @VadimAshikhman Creo que las etiquetas deben tener comillas, por lo que eliminarlas no sería correcto.

    –Nick Perkins

    2 de noviembre de 2012 a las 4:28

avatar de usuario
Lanzz

wp_generate_tag_cloud() invoca un filtro llamado tag_cloud_sortque puede anular el orden de clasificación especificado en el $args parámetro. los tag_cloud_sort El filtro recibe una serie de etiquetas y el real $args parámetro pasado a wp_generate_tag_cloud()para que pueda inspeccionar la configuración completa del wp_generate_tag_cloud() invocación y ajustar su comportamiento en consecuencia.

Podrías intentar algo como esto:

function custom_tag_sort($tags, $args) {
    if ($args['orderby'] != 'name') {
        // do not reorder if sort order is not by name.
        // wp_generate_tag_cloud() is smart enough to notice order
        // is not changed and will proceed with its regular sort logic.
        return $tags;
    }
    uasort($tags, 'custom_tag_sort_compare');
}

function custom_tag_sort_compare($a, $b) {
    return strnatcasecmp(
        custom_tag_sort_normalize($a->name),
        custom_tag_sort_normalize($b->name)
    );
}

function custom_tag_sort_normalize($tag) {
    // strip quote marks
    $tag = trim($tag, '"');
    // strip leading definitive article
    $tag = preg_replace('/^\s*the\s+/i', '', $tag);
    return $tag;
}

add_filter('tag_cloud_sort', 'custom_tag_sort');

Descargo de responsabilidad: he escrito esto después de una inspección superficial de la wp_generate_tag_cloud() función. No lo he probado en una instalación de WordPress en vivo; Solo verifiqué que la función de clasificación funciona correctamente en su nube de etiquetas de muestra:

The Abby
"autumn"
The Cloud
The Elephant
"rose"

  • Hola, esto parece prometedor. Lo he incluido en el archivo functions.php. Parece que todavía no funciona, pero déjame jugar con él y te votaré si esto me lleva al camino correcto. ¡Gracias!

    – Milán

    27 de octubre de 2012 a las 4:06

  • ..OK, votaré esto a pesar de que todavía no hice que esto funcione en mi secuencia de comandos ya que no estoy ordenando por ‘nombre’ sino que devuelvo una matriz, es decir: wp_tag_cloud(‘format=array’)

    – Milán

    28 de octubre de 2012 a las 5:46

  • El valor predeterminado para el orderby argumento para ambos wp_tag_cloud y wp_generate_tag_cloud es nameasí que si llamas wp_tag_cloud('format=array') seguirá ordenando por nombre en wp_generate_tag_cloud. Mi implementación solo evita la clasificación incorrecta si wp_generate_tag_cloud es explícitamente llamada con un orden de clasificación diferente.

    – lanzz

    28 de octubre de 2012 a las 9:21

ok, entonces quieres evitar modificar el código central de wordpress… cuando tu cliente presione el botón de actualización después de que le dijiste que no lo hiciera, entonces tendrás que entrar y jugar con él nuevamente… usa ganchos de acción en su lugar. convenientemente hay uno para conectarse a la salida para la función de nube de etiquetas. agregue esto a su archivo de funciones de temas

function tagCloudFilter($tagCloudString, $args)
{
    $tagCloudString = str_replace('The','', $tagCloudString);
    $tagCloudString = str_replace('"','', $tagCloudString);
}

add_filter('wp_tag_cloud', 'tagCloudFilter', 10, 2);

Eso al menos eliminará las cosas que no quieres. en cuanto a ordenarlo, no estoy seguro, pero esto debería ponerte en camino. puede ser más fácil ordenarlo con jquery

Si realmente desea modificar el código central, ejecute un ciclo foreach en la matriz de etiquetas antes de que se formatee y use str_replaces desde arriba en ese ciclo. Simplemente ejecute sort () en esa matriz y debería estar bien. Pero si fuera yo, iría con la solución media y no la ordenaría alfabéticamente para modificar el núcleo de wordpress.

  • PARTE 1: Hola; gracias. Tu comentario tiene sentido y estoy de acuerdo en que lo último que quisiera hacer es modificar el núcleo, obligándome a recordar los cambios cada vez que WP necesita actualizarse. Dicho esto, el gancho de acción str_replace es una gran solución. Sin embargo, tengo dificultades para descubrir cómo conectarme a la “función wp_generate_tag_cloud” correctamente, por lo que la consulta SQL también se modifica. Por ejemplo, de alguna manera podría agregar la consulta MySQL actual con la cláusula … ORDER BY TRIM (LEADING ‘The ‘ FROM (slug)). (No lo probé, solo estoy …

    – Milán

    24 de octubre de 2012 a las 3:49

  • PARTE 2: …cocinándolo desde la parte superior de mi cabeza) pero ¿CÓMO? Además, cuando uso str_replace, literalmente filtrará (reemplazará) los caracteres que de los valores de matriz que todavía necesito conservar. ¿Algún otro pensamiento? Gracias de nuevo.

    – Milán

    24 de octubre de 2012 a las 3:49

Aquí hay un pensamiento:

puede copiar la función tag_cloud original y crear la suya propia en functions.php.

Realiza los cambios que desea realizar y agrega este filtro dentro de la función:

$return = apply_filters( 'YOUR_tag_cloud_function', $return, $args );

Y luego crea el filtro anterior para agregar tu función al gancho:

add_filter('wp_tag_cloud', 'YOUR_tag_cloud_function');

No sé si funciona, no lo probé. ¿Qué piensas?

¿Ha sido útil esta solución?