Cómo hacer que una descripción de etiqueta sea obligatoria

6 minutos de lectura

avatar de usuario
mentón leung

Soy bastante nuevo en WordPress, pero básicamente lo que estoy tratando de lograr es hacer que la descripción de una etiqueta sea un campo obligatorio en mi tema personalizado para WordPress 4.5.2

Probé tres enfoques, pero todos fallaron, por lo que si algún experto en WordPress pudiera guiarme, sería bueno.

Enfoque #1

funciones.php

He intentado ‘editar’ el gancho cuando el edit_tag_form_fields y add_tag_form se llama hook, luego se modifica a través de Javascript

function require_category_description(){
    require_once('includes/require_category_description.php');
}
add_action('edit_tag_form_fields', 'require_category_description');
add_action('add_tag_form', 'require_category_description');

require_category_description.php

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            description.parents('form').submit(function(){
                if(description.val().trim().length < 1){
                    console.log('Please enter a description...');
                    return false;
                }
            });
        }
    });
</script>

No funcionaba, el formulario se enviaba a pesar de que el campo de descripción estaba vacío y, sobre todo, el archivo console.log dentro del detector de eventos nunca sucedió. Intenté registrar la variable de descripción para asegurarme de que va dentro del caso. Por lo tanto, asumí que el formulario nunca se envió, y todo el ‘envío’ se realiza a través de Ajax, al hacer clic en el botón.

Enfoque #2

los functions.php sigue siendo el mismo que el enfoque n. ° 1, pero he realizado algunos cambios en Javascript para apuntar al evento de clic de botón en lugar del evento de envío de formulario.

require_category_description.php

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            var button = description.parents('form').find('#submit');

            button.on('click', function(e){
                if(description.val().trim().length < 1)
                    console.log('Please enter a description...');

                e.preventDefault();
                return false;
            });
        }
    });
</script>

Sin embargo, el formulario aún se está enviando, pero esta vez, veo el mensaje de registro de la consola.

Por favor ingrese una descripción…

Mi teoría es que WordPress vincula un evento al clic del botón antes de mi evento, por lo que procesa el evento integrado con Ajax antes de ir a mi evento de clic personalizado.

Enfoque #3

require_category_description.php

Intenté desvincular los eventos de clic de mi botón antes de agregar mi propio evento de clic.

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            var button = description.parents('form').find('#submit');
            button.unbind('click');

            button.on('click', function(e){
                if(description.val().trim().length < 1)
                    console.log('Please enter a description...');

                e.preventDefault();
                return false;
            });
        }
    });
</script>

El resultado es el mismo que el enfoque #2. El formulario aún se está enviando, pero veo el mensaje de registro de la consola.

  • ¡Probablemente esté usando el evento de envío en lugar de onclick! intente desvincular en el formulario para ver si puede eliminar la acción del proceso

    – David

    20 mayo 2016 a las 21:17

avatar de usuario
nivelwpc

Editar etiqueta:

Al editar la etiqueta, llama a WordPress wp_update_term. Pero no hay filtros ni llamadas AJAX, por lo que debemos usar get_term() que es llamado por wp_update_term():

add_filter('get_post_tag', function($term, $tax)
{
    if ( isset($_POST['description']) && empty($_POST['description']) ) {
        return new \WP_Error('empty_term_name', __('Tag description cannot be empty!', 'text-domain'));
    } else {
        return $term;
    }
}, -1, 2);

También tenemos que actualizar term_updated_message para aclarar el error:

add_filter('term_updated_messages', function($messages)
{
    $messages['post_tag'][5] = sprintf('<span style="color:#dc3232">%s</span>', __('Tag description cannot be empty!', 'text-domain'));
    return $messages;
});

Porque WordPress codificado el mensaje de aviso div, utilicé css en línea para que el error pareciera una advertencia. Cámbialo a tu preferencia.


Agregar nueva etiqueta:

La solicitud de AJAX llama wp_insert_term para que podamos usar pre_insert_term filtrar. Prueba esto en tu functions.php

add_filter('pre_insert_term', function($term, $tax)
{
    if ( ('post_tag' === $tax) && isset($_POST['description']) && empty($_POST['description']) ) {
        return new \WP_Error('empty_term_name', __('Tag description cannot be empty!', 'text-domain'));
    } else {
        return $term;
    }
}, -1, 2);

Aquí usé el incorporado empty_term_name error al mostrar el mensaje de aviso, pero debe registrar uno propio.

Además, eche un vistazo a wp_ajax_add_tag para entender completamente lo que estamos haciendo.

Manifestación:

ingrese la descripción de la imagen aquí

  • ¡Lo siento por la respuesta tardía! Esto está funcionando para ajax, pero ¿sabe qué enlace es para la etiqueta de edición? Como cuando estás dentro de la propia etiqueta.

    – Chin Leung

    24 de mayo de 2016 a las 14:12

  • @ChinLeung No tengo idea de por qué también debes hacerlo en editing tag screen cuando es imposible agregar una nueva etiqueta sin descripción. Pero he actualizado la respuesta como deseabas.

    – wpclevel

    25 de mayo de 2016 a las 7:59


  • Necesito la pantalla de edición de etiquetas porque aunque un usuario no puede agregar una etiqueta vacía… Puede editar la etiqueta y simplemente eliminar la descripción, lo que resultaría en una etiqueta con una descripción vacía. 🙂

    – Chin Leung

    26 mayo 2016 a las 14:12

avatar de usuario
sark

Es Ajax, así que no puedes confiar en submit evento, aquí hay una solución, cómo se puede hacer.

Todo lo que quieres hacer es incluir form-required class a la etiqueta principal del elemento en particular, pero hay una patada en él. sus validateForm verificar solo en input etiquetas no puestas textarea así que he implementado una idea, funciona.

Prueba esto

function put_admin_script() { ?>
<script>

    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if( !description ) { 
            description = jQuery('#description'); 
        }   
        if( description ) {
            description.after( $('<p style="visibility:hidden;" class="form-field form-required term-description-wrap"><input type="text" id="hidden-tag-desc" aria-required="true" value="" /></p>') );    
        }   
        description.keyup(function(){
            $("#hidden-tag-desc").val( $(this).val() ); 
        });

        jQuery("#addtag #submit").click(function(){
            console.log("Not empty"+description.val().trim().length);
            if( description.val().trim().length < 1 ) {
                description.css( "border", "solid 1px #dc3232" );
            } else {
                description.css( "border", "solid 1px #dddddd" );
            }                   
        }); 
    }); 

</script>
<?php 
}
add_action('admin_footer','put_admin_script');

  • Acabo de probarlo, el formulario se está enviando, no hay mensaje de consola. Como mencioné en el enfoque n. ° 1, creo que el formulario en sí nunca se envía.

    – Chin Leung

    20 mayo 2016 a las 17:50

  • Oh, justo ahora yo también lo comprobé. es ajax

    – Sark

    20 mayo 2016 a las 17:51

  • wp-admin/js/tags.js LN: 31, pero parece que no podemos hacer nada al respecto.

    – Sark

    20 mayo 2016 a las 18:11

  • Me gustaría evitar hacer cambios en el wp-admin porque se anularía en la próxima versión de la actualización de WordPress…

    – Chin Leung

    20 mayo 2016 a las 18:30

  • Encontré una solución, funciona, pero no es completa, puedes mejorarla de todos modos.

    – Sark

    20 mayo 2016 a las 18:36

¿Ha sido útil esta solución?

Cómo hacer que una descripción de etiqueta sea obligatoria

6 minutos de lectura

avatar de usuario
mentón leung

Soy bastante nuevo en WordPress, pero básicamente lo que estoy tratando de lograr es hacer que la descripción de una etiqueta sea un campo obligatorio en mi tema personalizado para WordPress 4.5.2

Probé tres enfoques, pero todos fallaron, por lo que si algún experto en WordPress pudiera guiarme, sería bueno.

Enfoque #1

funciones.php

He intentado ‘editar’ el gancho cuando el edit_tag_form_fields y add_tag_form se llama hook, luego se modifica a través de Javascript

function require_category_description(){
    require_once('includes/require_category_description.php');
}
add_action('edit_tag_form_fields', 'require_category_description');
add_action('add_tag_form', 'require_category_description');

require_category_description.php

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            description.parents('form').submit(function(){
                if(description.val().trim().length < 1){
                    console.log('Please enter a description...');
                    return false;
                }
            });
        }
    });
</script>

No funcionaba, el formulario se enviaba a pesar de que el campo de descripción estaba vacío y, sobre todo, el archivo console.log dentro del detector de eventos nunca sucedió. Intenté registrar la variable de descripción para asegurarme de que va dentro del caso. Por lo tanto, asumí que el formulario nunca se envió, y todo el ‘envío’ se realiza a través de Ajax, al hacer clic en el botón.

Enfoque #2

los functions.php sigue siendo el mismo que el enfoque n. ° 1, pero he realizado algunos cambios en Javascript para apuntar al evento de clic de botón en lugar del evento de envío de formulario.

require_category_description.php

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            var button = description.parents('form').find('#submit');

            button.on('click', function(e){
                if(description.val().trim().length < 1)
                    console.log('Please enter a description...');

                e.preventDefault();
                return false;
            });
        }
    });
</script>

Sin embargo, el formulario aún se está enviando, pero esta vez, veo el mensaje de registro de la consola.

Por favor ingrese una descripción…

Mi teoría es que WordPress vincula un evento al clic del botón antes de mi evento, por lo que procesa el evento integrado con Ajax antes de ir a mi evento de clic personalizado.

Enfoque #3

require_category_description.php

Intenté desvincular los eventos de clic de mi botón antes de agregar mi propio evento de clic.

<script>
    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if(!description) description = jQuery('#description');

        if(description){
            var button = description.parents('form').find('#submit');
            button.unbind('click');

            button.on('click', function(e){
                if(description.val().trim().length < 1)
                    console.log('Please enter a description...');

                e.preventDefault();
                return false;
            });
        }
    });
</script>

El resultado es el mismo que el enfoque #2. El formulario aún se está enviando, pero veo el mensaje de registro de la consola.

  • ¡Probablemente esté usando el evento de envío en lugar de onclick! intente desvincular en el formulario para ver si puede eliminar la acción del proceso

    – David

    20 mayo 2016 a las 21:17

avatar de usuario
nivelwpc

Editar etiqueta:

Al editar la etiqueta, llama a WordPress wp_update_term. Pero no hay filtros ni llamadas AJAX, por lo que debemos usar get_term() que es llamado por wp_update_term():

add_filter('get_post_tag', function($term, $tax)
{
    if ( isset($_POST['description']) && empty($_POST['description']) ) {
        return new \WP_Error('empty_term_name', __('Tag description cannot be empty!', 'text-domain'));
    } else {
        return $term;
    }
}, -1, 2);

También tenemos que actualizar term_updated_message para aclarar el error:

add_filter('term_updated_messages', function($messages)
{
    $messages['post_tag'][5] = sprintf('<span style="color:#dc3232">%s</span>', __('Tag description cannot be empty!', 'text-domain'));
    return $messages;
});

Porque WordPress codificado el mensaje de aviso div, utilicé css en línea para que el error pareciera una advertencia. Cámbialo a tu preferencia.


Agregar nueva etiqueta:

La solicitud de AJAX llama wp_insert_term para que podamos usar pre_insert_term filtrar. Prueba esto en tu functions.php

add_filter('pre_insert_term', function($term, $tax)
{
    if ( ('post_tag' === $tax) && isset($_POST['description']) && empty($_POST['description']) ) {
        return new \WP_Error('empty_term_name', __('Tag description cannot be empty!', 'text-domain'));
    } else {
        return $term;
    }
}, -1, 2);

Aquí usé el incorporado empty_term_name error al mostrar el mensaje de aviso, pero debe registrar uno propio.

Además, eche un vistazo a wp_ajax_add_tag para entender completamente lo que estamos haciendo.

Manifestación:

ingrese la descripción de la imagen aquí

  • ¡Lo siento por la respuesta tardía! Esto está funcionando para ajax, pero ¿sabe qué enlace es para la etiqueta de edición? Como cuando estás dentro de la propia etiqueta.

    – Chin Leung

    24 de mayo de 2016 a las 14:12

  • @ChinLeung No tengo idea de por qué también debes hacerlo en editing tag screen cuando es imposible agregar una nueva etiqueta sin descripción. Pero he actualizado la respuesta como deseabas.

    – wpclevel

    25 de mayo de 2016 a las 7:59


  • Necesito la pantalla de edición de etiquetas porque aunque un usuario no puede agregar una etiqueta vacía… Puede editar la etiqueta y simplemente eliminar la descripción, lo que resultaría en una etiqueta con una descripción vacía. 🙂

    – Chin Leung

    26 mayo 2016 a las 14:12

avatar de usuario
sark

Es Ajax, así que no puedes confiar en submit evento, aquí hay una solución, cómo se puede hacer.

Todo lo que quieres hacer es incluir form-required class a la etiqueta principal del elemento en particular, pero hay una patada en él. sus validateForm verificar solo en input etiquetas no puestas textarea así que he implementado una idea, funciona.

Prueba esto

function put_admin_script() { ?>
<script>

    jQuery(document).ready(function(){
        var description = jQuery('#tag-description');
        if( !description ) { 
            description = jQuery('#description'); 
        }   
        if( description ) {
            description.after( $('<p style="visibility:hidden;" class="form-field form-required term-description-wrap"><input type="text" id="hidden-tag-desc" aria-required="true" value="" /></p>') );    
        }   
        description.keyup(function(){
            $("#hidden-tag-desc").val( $(this).val() ); 
        });

        jQuery("#addtag #submit").click(function(){
            console.log("Not empty"+description.val().trim().length);
            if( description.val().trim().length < 1 ) {
                description.css( "border", "solid 1px #dc3232" );
            } else {
                description.css( "border", "solid 1px #dddddd" );
            }                   
        }); 
    }); 

</script>
<?php 
}
add_action('admin_footer','put_admin_script');

  • Acabo de probarlo, el formulario se está enviando, no hay mensaje de consola. Como mencioné en el enfoque n. ° 1, creo que el formulario en sí nunca se envía.

    – Chin Leung

    20 mayo 2016 a las 17:50

  • Oh, justo ahora yo también lo comprobé. es ajax

    – Sark

    20 mayo 2016 a las 17:51

  • wp-admin/js/tags.js LN: 31, pero parece que no podemos hacer nada al respecto.

    – Sark

    20 mayo 2016 a las 18:11

  • Me gustaría evitar hacer cambios en el wp-admin porque se anularía en la próxima versión de la actualización de WordPress…

    – Chin Leung

    20 mayo 2016 a las 18:30

  • Encontré una solución, funciona, pero no es completa, puedes mejorarla de todos modos.

    – Sark

    20 mayo 2016 a las 18:36

¿Ha sido útil esta solución?