¿Enganchar para procesar una nueva etiqueta de taxonomía antes de crearla?

4

Estoy trabajando en un sitio web donde existe una taxonomía personalizada para lugares, que pueden ser ciudades o estados. Los usuarios deben etiquetar cada publicación con una ciudad y un estado. Para lidiar con ciudades desambiguadoras con el mismo nombre en varios estados, esas etiquetas de ciudad tienen el nombre de estado agregado (por ejemplo, "Miami, Florida" tiene el nombre "Miami Florida" y "Miami, Ohio" tiene el nombre "Miami Ohio").

Los usuarios no han podido dominar este sistema, a pesar del autocompletado, y siguen ingresando "Miami, Florida", lo que crea una nueva etiqueta "Miami" junto con la etiqueta existente de Florida.

Me gustaría interceptar la entrada del usuario cuando la publicación está guardada y una nueva etiqueta está a punto de crearse, para ver si la combinación ciudad-estado ya existe (es decir, si una etiqueta es Miami y la otra es Florida , ¿ya existe "Miami Florida"? Luego me gustaría bloquear la creación de la nueva etiqueta y, en su lugar, aplicar la etiqueta existente a la publicación.

¿Qué enlace usaría y cómo modificaría las etiquetas en la publicación?

    
pregunta Joel 30.04.2016 - 01:16

1 respuesta

2

El gancho que está buscando es created_{$taxonomy} pero hay otro problema. Creo que el mayor defecto en la lógica es poner a los estados y las ciudades en la misma taxonomía. Nunca podrá diferenciar entre los dos términos (que es la ciudad y el estado). Esto abre al usuario para hacer algunos de los siguientes, todos los cuales son incorrectos

  • ingrese ciudad sin estado
  • ingrese el estado sin ciudad
  • Estado o ciudad con faltas de ortografía

Creo que la solución aquí es dividir los estados y las ciudades en dos taxonomías diferentes. tax_states y tag_cities . Esto asegurará que cada publicación tenga un estado y que cada etiqueta de ciudad tenga un prefijo con el estado. Voy a comenzar el siguiente código con el supuesto de que las dos taxonomías están registradas.

Primero, agreguemos un poco de jQuery para asegurarnos de que se establezca un estado; es posible que desee considerar encolar pero ya que es un pequeño script tal vez no:

function post_type_custom_script() {
    global $post_type;

    if( 'post' === $post_type ) {
      ?>

        <script type="text/javascript">
            /* Checks if cat is selected when publish button is clicked */
            jQuery( '#submitdiv' ).on( 'click', '#publish', function( e ) {
                var $checked = jQuery( '#category-all li input:checked' );

                //Checks if cat is selected
                if( $checked.length <= 0 ) {
                    alert( "Please select a State" );
                    return false;
                } else { 
                    return true;
                }
            } );
        </script>

      <?php
    }
}
add_action( 'admin_footer', 'post_type_custom_script' );

El mayor problema con el script anterior es que asume que su taxonomía es jerárquica (casillas de verificación), pero como en teoría solo se debe seleccionar un estado, ni una taxonomía es una opción óptima. En su lugar, puede crear una lista de selección de términos y utilizar save_post para guardar el término o (lo que sugeriría) cambiar las casillas de verificación jerárquicas a los botones de radio ( Clase PHP , Botones de radio para el complemento de taxonomías ).

Ahora deberíamos tener una taxonomía para los estados que se debe seleccionar para publicar y un cuadro de etiqueta para las ciudades. El siguiente paso es agregar el estado a la etiqueta de la ciudad cada vez que se publique. Es una gran lista de condicionales, por lo que he agregado comentarios cuando sea necesario. Si de alguna manera no se selecciona un estado, pasamos la publicación a un borrador como último resultado:

/**
 * This function runs whenever a post is saved
 *
 * @param Int $post_id
 *
 * @return void
 */
function state_appended_tags( $post_id ) {
    global $post;

    if( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ( ! current_user_can( 'edit_post', $post_id ) || ! is_object( $post ) ) ) {
        return $post_id;
    }

    if( 'post' === $post->post_type ) {
        $state      = false;
        $set_draft  = false;

        if( isset( $_POST['tax_input'] ) && ! empty( $_POST['tax_input'] ) ) {

            // Grab State
            // If using the Radio Buttons Plugin linked above, use this conditional
                // if( isset( $_POST['radio_tax_input']['tax_states'] ) && ! empty( $_POST['radio_tax_input']['tax_states'] ) && 0 !== $_POST['radio_tax_input']['tax_states'][0] ) {
                    // $state_obj  = get_term_by( 'id', $_POST['radio_tax_input']['tax_states'][0], 'tax_states' ); // Grab Term Object
                    // $state_slug = $state_obj->slug;
            if( isset( $_POST['tax_input']['tax_states'] ) && ! empty( $_POST['tax_input']['tax_states'] ) && 0 !== $_POST['tax_input']['tax_states'][0] ) {
                $state_obj  = get_term_by( 'id', $_POST['tax_input']['tax_states'][0], 'tax_states' );  // Grab Term Object
                $state_slug = $state_obj->slug;
            } else {
                $set_draft = true;
            }

            // Prefix Cities
            if( ! empty( $state_slug ) && isset( $_POST['tax_input']['tag_cities'] ) && ! empty( $_POST['tax_input']['tag_cities'] ) ) {
                $new_tags = array();

                foreach( $_POST['tax_input']['tag_cities'] as $city ) {
                    $city_obj   = false;
                    $city_slug  = '';

                    // Post tags come in two forms - slugs and integers
                    if( is_numeric( $city ) ) {
                        $city_obj  = get_term_by( 'id', $city, 'tag_cities' );  // Grab Term Object
                        $city_slug = $city_obj->slug;
                    } else {
                        $city_obj  = get_term_by( 'slug', $city, 'tag_cities' );    // Grab Term Object
                        $city_slug = $city_obj->slug;
                    }

                    // If user has already entered the correct state-city formatted tag, skip it
                    // Otherwise we'll enter the conditional
                    if( 0 !== strcmp( "{$state_slug}-{$city_slug}", $city_slug ) ) {
                        $new_tags[] = "{$state_slug}-{$city_slug}";
                        wp_delete_term( $city_obj->term_id, 'tag_cities' );     // Delete Term
                    }
                }

                // Set New State Appended Tags
                if( ! empty( $new_tags ) ) {
                    wp_set_object_terms( $post_id, $new_tags, 'tag_cities', false );
                }
            }
        } else {
            $set_draft = true;
        }

        // Finally, should something have failed, don't publish the post and investigate
        if( $set_draft ) {
            remove_action( 'save_post', 'state_appended_tags' );
            wp_update_post( array(
                'ID'            => $post_id,
                'post_status'   => 'draft',
            ) );
            add_action( 'save_post', 'state_appended_tags' );
        }
    }
}
add_action( 'save_post', 'state_appended_tags' );

Tendrás que cambiar tag_cities y tax_states con tus taxonomías reales, pero esto debería funcionar para ti.

    
respondido por el Howdy_McGee 10.09.2016 - 21:12

Lea otras preguntas en las etiquetas