1
resposta

Tratamento de erro com $wpdb

Boa noite

Alguem pode me ajudar, no caso eu tentei usar alguns hooks como pre_delete_term(). wp_delete_term(), mas não obtive nenhum sucesso. Então tive a ideia de criar um Term, 'Lixeira' e quando eu clicar para excluir ele enviar para essa lixeira como filho dela. Fiz isso usando o $wpdb->update() e funcionou, mas o maior problema é que eu to chamando essa função com um button onclick() assim:

add_filter( "cat_notice_row_actions", 'trash_row_actions', 10, 2 );
function trash_row_actions( $actions, $user_object ) {
    // Remove the Edit action.
    unset( $actions['delete'] );

    $catTrash = 10;
    $id = $user_object->term_id;
    $taxName = $user_object->taxonomy;
    $taxParent = $user_object->parent;
    $count = $user_object->count;

    if($user_object->slug <> 'lixeira' && $taxParent <> $catTrash){

        $actions['updatecat'] = "<form action='#' method='get'>
            <input type='hidden' name='taxonomy' value='$taxName'>
            <input type='hidden' name='post_type' value='noticia'>
            <input type='hidden' name='termID' value='$id'>
            <input type='hidden' name='trashID' value='$catTrash'>
            <input type='hidden' name='count' value='$count'>
            <input style='border: none!important;
            background: none!important;
            color: red!important;
            padding: 0!important;
            cursor: pointer;' class='btadd' id='$id-idcat' type='submit' value='Excluir' onclick='add_trash_bin()'>
        </form>";

    }

    return $actions;
}

Passando os dados via get, por que o wordpress já usa algumas coisas assim, e a função ela deveria funcionar quando clicar; mas ai que esta um dos problemas, ela só funciona se eu adicionar a função no hook admin_init só que fazendo isso ele fica me retornando a mensagem de erro. Então preciso de um help se alguém souber me ajudar a arrumar a hora correta de aparecer as msg, e a função funcionar sem o admin_init se for posssível usar sem o hook

add_action( 'admin_init', 'add_trash_bin' );

function add_trash_bin() {
    global $wpdb;
    global $pagenow;
    $table_name = $wpdb->prefix . 'term_taxonomy';
    $id = isset($_GET['termID']) ? $_GET['termID'] : NULL;
    $taxName = isset($_GET['taxonomy']) ? $_GET['taxonomy'] : NULL;
    $trashID = isset($_GET['trashID']) ? $_GET['trashID'] : NULL;
    $count = isset($_GET['count']) ? $_GET['count'] : 0;


    if($id <> NULL && $taxName <> NULL && $trashID <> NULL)

    {
        $wpdb->update(
            $table_name,
            array(
                'parent' => $trashID,
                'count' => 0
            ), array(
                'term_id' => $id
            )
        );

        //$query = $wpdb->update($table_name, array('parent' => $trashID), array('term_id' => $id));

        clean_taxonomy_cache( $taxName );

        if($pagenow === 'edit-tags.php'){
            echo ' <div class="notice notice-success">
                    <p>Categoria alocada na Lixeira</p>
                </div> ';
        };

    } else {

        clean_taxonomy_cache( $taxName );

        if($pagenow === 'edit-tags.php'){
            echo '<div class="notice notice-error">
                <p>Esta categoria tem notícias vinculadas, desvincú-las e tente novamente</p>
            </div> ';
        };
    }

}
1 resposta

Olá Felipe, tudo bem?

Desculpe a demora em te responder!

Uma sugestão seria tentar utilizar o hook wp_ajax_ para fazer a sua função funcionar.

O wp_ajax_ é um hook que permite que você crie funções que podem ser chamadas através de uma requisição AJAX. Dessa forma, você poderia chamar a sua função através de uma requisição AJAX, sem a necessidade de utilizar o hook admin_init.

Segue um exemplo de como você poderia fazer isso:

  1. Adicione o seguinte código no seu arquivo functions.php:
add_action( 'wp_ajax_add_trash_bin', 'add_trash_bin' );
add_action( 'wp_ajax_nopriv_add_trash_bin', 'add_trash_bin' );
  1. Modifique o seu código JavaScript para chamar a função através de uma requisição AJAX:
function add_trash_bin() {
    var data = {
        'action': 'add_trash_bin',
        'termID': jQuery('#termID').val(),
        'taxonomy': jQuery('#taxonomy').val(),
        'trashID': jQuery('#trashID').val(),
        'count': jQuery('#count').val()
    };

    jQuery.post(ajaxurl, data, function(response) {
        alert('Categoria alocada na Lixeira');
    });
}
  1. Modifique a sua função PHP para receber a requisição AJAX:
function add_trash_bin() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'term_taxonomy';
    $id = isset($_POST['termID']) ? $_POST['termID'] : NULL;
    $taxName = isset($_POST['taxonomy']) ? $_POST['taxonomy'] : NULL;
    $trashID = isset($_POST['trashID']) ? $_POST['trashID'] : NULL;
    $count = isset($_POST['count']) ? $_POST['count'] : 0;

    if($id <> NULL && $taxName <> NULL && $trashID <> NULL)
    {
        $wpdb->update(
            $table_name,
            array(
                'parent' => $trashID,
                'count' => 0
            ), array(
                'term_id' => $id
            )
        );

        clean_taxonomy_cache( $taxName );

        wp_die();

    } else {

        clean_taxonomy_cache( $taxName );

        wp_die();
    }
}

Espero ter ajudado. Caso tenha dúvidas, estarei à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!