posts – Orden de clasificación de publicaciones diferente dentro de diferentes categorías

Pregunta:

Necesito darle a cada publicación una orden de publicación única para múltiples Categorías (por publicación) en la que se encuentra. Puedo imaginar una solución usando campos personalizados en la que para cada Categoría hay un campo personalizado correspondiente para la orden.

P.ej

Categorías: Lista de reproducción1 Lista de reproducción2 Lista de reproducción3

Campos personalizados para la publicación: Playlist1_Order Playlist2_Order Playlist3_Order

Obviamente, este método no es fácilmente escalable, así que me gustaría saber si alguien tiene una solución más elegante.

Fondo

Estoy configurando un sitio para acompañar una transmisión 24 horas al día, 7 días a la semana. La lista de reproducción para la transmisión es un bucle de 12 horas que se modifica una vez por semana. Se agregan y eliminan algunos programas y se reorganiza el orden de algunos programas. Tengo la intención de definir un tipo de publicación personalizada de programas y una taxonomía personalizada de la lista de reproducción. Cada programa se agregará a una o más listas de reproducción. Debe ser posible que el programa tenga un orden único en cada lista de reproducción.

(Decidí mantener la pregunta limitada a publicaciones y categorías en lugar de tipos de publicaciones y taxonomías para evitar confusiones).

ACTUALIZAR

Para aclarar, considere este ejemplo. Hay una publicación llamada "Resumen de radio de Rod". Está en las categorías "Programación de martes" y "Programación de miércoles". El martes es el tercer programa y el miércoles es el séptimo programa. Más tarde, sale el miércoles, pero pasa al primer puesto el jueves y al quinto puesto el sábado. Y hay otras 40 publicaciones como esta.

La pregunta esencial: ¿Cómo se mantienen varios pedidos, uno por categoría, para una sola publicación?

Respuesta:

Recientemente superé este mismo desafío. Necesitábamos una forma de guardar un orden de clasificación diferente para cada publicación en varias categorías.

Hay una columna no utilizada en la tabla wp_term_relationships, term_order , que tiene el valor predeterminado de 0 y ya se ha convertido en un número entero.

Cuando se asigna un término a una publicación, se obtiene una entrada en esta tabla para cada término asignado. Un object_ID (post_ID), un term_taxonomy_ID y el orden de términos se establece en 0.

Desafíos:

  1. El term_taxonomy_ID a veces es diferente del term_ID, por lo que tendrá que conocer sus term_taxonomy_ID para cada categoría.

  2. Dado que el valor predeterminado es siempre 0, necesita un método para establecer esto en un número más alto o todas sus publicaciones nuevas siempre aparecerán primero.

    • La forma más fácil es simplemente alterar la base de datos predeterminada a un número mayor. El otro método es crear una función y adjuntarla al gancho save_post, update_post o draft_to_publish.
  3. También necesitará una forma de consultar estas publicaciones, ya que term_order no es parte de la clase WP_Query.

    • Utilice el filtro posts_where o escriba una función de consulta personalizada.
  4. También necesitará una forma de ordenar estas publicaciones. Resumiré el método de arrastrar y soltar de Ajax que utilicé, pero también podrías usar un metabox o un campo personalizado.

Arrastrar y soltar ordenado por Ajax:

Deberá crear una página de opciones de administración y consultar las publicaciones y enviarlas a una tabla personalizada o lista desordenada. También puede ejecutar esto usando Ajax para que el usuario solo tenga que seleccionar una categoría de un cuadro de selección y luego cargar las publicaciones de esa categoría. (Solo proporcionaré las funciones Ajax y Php para guardar el pedido).

Función PHP wp_ajax:

add_action ( 'wp_ajax_item_sort', 'wnd_save_item_order' );
    function wnd_save_item_order () {
        global $wpdb;
        $wpdb->flush ();
        $posts = $_POST[ 'order' ];
        $str = str_replace ( "post-", "", $posts );
        $order = explode ( ',', $str );
        $cat_id = (int)$_POST[ 'cat' ];
        $counter = 1;
        foreach ( $order as $item_id ) {

            $wpdb->query ( "UPDATE $wpdb->term_relationships SET term_order = '$counter' WHERE object_id = '$item_id' AND term_taxonomy_id = '$cat_id'" );
            $counter++;
        }
         $response = '<div id="message" class="updated fade"> <p>Sort Order successfully updated</p></div>';
         echo $response;
         die( '<div id="message" class="updated fade"> <p>An error occured, order has not been saved.</p></div>' );
    }

El jQuery Ajax:

// Add this to the admin_enque_scripts and do a $pagenow check.
function sort_order_js() { ?> 
  jQuery(document).ready(function($) {
     var catID = $("#cat-select option:selected").val()
      $("#" + catID + "-save-order").bind("click", function() {
      $("#" + catID + "-load-animation").show();

          $.post(ajaxurl, { action:'item_sort', cat: catID, pos: position, order: $("#" + catID + "-sortable").sortable('toArray').toString() },

          function(response) {
              $("#" + catID + "-update-response").text('Updated');
              $("#" + "-load-animation").hide();
               });
                return false;
            });

            <?php } ?>

¿Cómo obtenemos nuestras publicaciones recién solicitadas?

posts_orderby filtro:

add_filter('posts_orderby', 'custom_posts_orderby');
function custom_posts_orderby($order) {
    $order_by = 'wp_term_relationships.term_order';
    $direction = 'DESC';
    $order = " ORDER BY $order_by $direction";
    return $order;
}

API de consultas personalizadas

Puede ejecutar esta función pasándole una matriz de argumentos similar a WP_Query y devolverá una matriz de post_ids

function custom_get_post_ids( $args ) {
        $defaults = array (
            'category_id'               => NULL,
            'exclude_array'             => array (),
            'post_status_array'         => array ( 'publish' ),
            'post_status'               => NULL,
            'post_type_array'           => array ( 'post' ),
            'post_type'                 => NULL,
            'offset'                    => 0,
            'length'                    => 7,
            'order_by'                  => 'wp_term_relationships.term_order',
            'order_direction'           => 'ASC',
            'secondary_order_by'        => 'post_date',
            'secondary_order_direction' => 'DESC',
        );

    $args = wp_parse_args( $args, $defaults );
    extract( $args, EXTR_SKIP );
    if ( isset( $post_type ) ) {
        $post_type_array = array ( $post_type );
    }
    // If the post_status passed to us is a string, convert it to an array
    if ( isset( $post_status ) ) {
        $post_status_array = array ( $post_status );
    }
    global $wpdb;
    $query = 'SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)';
    $query .= ' WHERE wp_term_relationships.term_taxonomy_id IN (' . intval( $category_id ) . ')';
    if ( count( $exclude_array ) > 0 ) {
        $exclude = implode( ',', $exclude_array );
        $query .= ' AND wp_posts.ID NOT IN (' . $exclude . ')';
    }
    $query .= " AND wp_posts.post_type IN('" . implode( "','", $post_type_array ) . "')";
    $query .= " AND wp_posts.post_status IN('" . implode( "','", $post_status_array ) . "')";
        $query .= " ORDER BY $order_by $order_direction";
    if ( ! empty( $secondary_order_by ) ) {
        $query .= ",$secondary_order_by $secondary_order_direction";
    }
    $query .= " LIMIT $offset, $length /*_get_post_ids() */";
    $num_results = $wpdb->query( $query );
    $res = array ();
    foreach ( $wpdb->last_result as $r ) {
        array_push( $res, intval( $r->ID ) );
    }
    return ( $res );
    }

Finalmente, solo necesitamos configurar nuevas publicaciones para tener un term_taxonomy_id más alto que la cantidad habitual de publicaciones que se ordenan.

function default_sort_order() {
    global $post, $wpdb;
    $categories = get_the_category( $post->ID);
    $id = $post->ID;
        foreach ( $categories as $cat ) {
            $cat_id = $cat->term_taxonomy_id;
            $wpdb->query ( "UPDATE $wpdb->term_relationships SET term_order = 20 WHERE object_id = '$id' AND term_taxonomy_id = '$cat_id'" );

        }
}

¿Aún aquí?

Este método ha sido probado y es utilizado por una gran organización de noticias para configurar el orden de visualización en la página de inicio y las páginas de categorías.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım