Gancho para processar uma nova tag de taxonomia antes de ser criada?

4

Estou trabalhando em um site em que há uma taxonomia personalizada para lugares, que podem ser cidades ou estados. Os usuários devem marcar cada postagem com uma cidade e um estado. Para lidar com a desambiguação de cidades com o mesmo nome em vários estados, essas marcas da cidade têm o nome do estado anexado (por exemplo, "Miami, Flórida" tem o nome "Miami Florida" e "Miami, Ohio").

Os usuários não conseguiram dominar este sistema, apesar do preenchimento automático, e continuam inserindo "Miami, Flórida", o que cria uma nova tag "Miami" junto com a tag Florida existente.

Eu gostaria de interceptar a entrada do usuário quando a postagem for salva e uma nova tag estiver prestes a ser criada, para ver se a combinação cidade-estado já existe (ou seja, se uma tag é Miami e a outra é Flórida , "Miami Florida" já existe. Então, gostaria de bloquear a criação da nova tag e, em vez disso, aplicar a tag existente à postagem.

Qual gancho eu usaria e como alteraria as tags no post?

    
por Joel 30.04.2016 / 01:16

1 resposta

2

O gancho que você está procurando é created_{$taxonomy} , mas há outro problema. Eu acho que a maior falha na lógica é colocar estados e cidades na mesma taxonomia. Você nunca será capaz de diferenciar entre os dois termos (que é a cidade e qual é o estado). Isso abre o usuário para fazer alguns dos seguintes itens, todos incorretos

  • Insira a cidade sem estado
  • Insira o estado sem cidade
  • Estado ou cidade do erro ortográfico

Acho que a solução aqui é dividir os estados e cidades em duas taxonomias diferentes. tax_states e tag_cities . Isso garantirá que todas as postagens tenham um estado e todas as tags da cidade sejam prefixadas com o estado. Vou começar o código abaixo com a suposição de que as duas taxonomias estão registradas.

Primeiro, vamos adicionar alguns jQuery para garantir que um estado esteja definido - você pode querer considerar enfileiramento mas, como é um pequeno roteiro, talvez não:

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' );

O maior problema com o script acima é que ele pressupõe que sua taxonomia é hierárquica (caixas de seleção) - mas como, em teoria, apenas um estado deve ser selecionado, nem a taxonomia é a melhor escolha. Em vez disso, você poderia criar uma lista de seleção de termos e usar save_post para salvar o termo ou (o que eu sugeriria) alterar as caixas de seleção hierárquicas para Botões de opção ( PHP Class , Botões de Rádio para Taxonomias Plugin ).

Agora, devemos ter uma taxonomia para os estados que precisam ser selecionados para publicar e uma caixa de tags para as cidades. O próximo passo é anexar o estado à tag city sempre que for publicado. É uma lista pesada de condicionais, então adicionei comentários quando necessário. Se de alguma forma um estado não for selecionado, transformaremos a postagem em um rascunho como o ú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' );

Você precisará trocar tag_cities e tax_states com suas taxonomias reais, mas isso deve funcionar para você.

    
por Howdy_McGee 10.09.2016 / 21:12