wp_verify_nonce continua falhando

Eu precisava atribuir categorias para postar do frontend, então eu estou fazendo uso da solução sugerida neste tópico , na forma de um plugin. Está funcionando como esperado. Eu só queria adicionar um campo de nonce para torná-lo um pouco mais seguro. Eu parecia ter falhado até agora para fazê-lo funcionar enquanto eu continuo ficando “Desculpe, seu nonce não verificou”.

O código completo é fornecido abaixo, incluindo as mudanças que fiz, que estão nas linhas 42 e 103. Aqui também é um link para filar pingente , no caso de você precisar identificar as linhas. Em ambas as linhas, tentei tirar a dica desta página wordpress. Olhe apenas e me avise por que o nonce continua falhando em verificar.

 false ); $args = apply_filters( 'mcc_allowed_terms_args', $args, $post_id, $tax ); $args['fields'] = 'ids'; $allowed_terms = get_terms( $tax, $args ); foreach ( $suggested_terms as $key => $term_id ) if ( ! in_array( $term_id, $allowed_terms ) ) unset( $suggested_terms[$key] ); // Add terms to taxonomy $affected_terms = wp_set_object_terms( $post_id, $suggested_terms, $tax, false ); update_term_cache($affected_terms); return $affected_terms; } } function get_form( $post_id=null, $tax='category' ) { if ( is_null($post_id) || ! taxonomy_exists($tax) ) return false; $args = array( 'hide_empty' => false ); $args = apply_filters( 'mcc_get_terms_args', $args, $post_id, $tax ); $all_terms = get_terms( $tax, $args ); if ( ! $all_terms ) return false; $post_terms = wp_get_object_terms( $post_id, $tax, array( 'fields' => 'ids' ) ); $permalink = get_permalink( $post_id ); $out = "
    "; foreach ( $all_terms as $t ) : $checked = in_array( $t->term_id, $post_terms) ? 'checked' : ''; $out .= "
  • term_id' name='crowd-cat-radio[]' value='$t->term_id' $checked />
  • "; endforeach; $out .= "
"; //TODO: set nonce $out .= "
"; return $out; } function append_form($content){ global $post; if ( 'post' != $post->post_type ) return $content; $form = $this->get_form( $post->ID ); if ( ! $form ) return $content; return "$content \n $form"; } function wpse_crowd_cats_form( $post_id=null, $taxonomy='category' ) { if ( is_null($post_id) ) { global $post; $post_id = $post->ID; } echo $this->get_form( $post_id, $taxonomy ); } } // end of class ?>

Muito novo para o php aqui, seja gentil.

Solutions Collecting From Web of "wp_verify_nonce continua falhando"

Você não está inserindo o campo nonce em seu formulário, então seu script não receberá o campo nonce e este código:

  if ( !isset($_POST['nonce_name'])) 

Será validado porque $_POST['nonce_name'] não está configurado.

No seu código, remova esta linha:

  

E, onde disse //TODO: set nonce , você precisa include:

  $out .= wp_nonce_field( plugin_basename( __FILE__ ), 'nonce_name',true,false); 

Nota: defina o wp_nonce_field() ‘echo’ de wp_nonce_field() como falso para recuperar o campo de input nonce em vez de imprimi-lo.

E depois verifique por:

 if (!isset( $_POST['nonce_name'] ) || ! wp_verify_nonce( $_POST['nonce_name'], plugin_basename( __FILE__ ) ) ) return; 

Então, sua function get_form() deve ser:

  function get_form( $post_id=null, $tax='category' ) { if ( is_null($post_id) || ! taxonomy_exists($tax) ) return false; $args = array( 'hide_empty' => false ); $args = apply_filters( 'mcc_get_terms_args', $args, $post_id, $tax ); $all_terms = get_terms( $tax, $args ); if ( ! $all_terms ) return false; $post_terms = wp_get_object_terms( $post_id, $tax, array( 'fields' => 'ids' ) ); $permalink = get_permalink( $post_id ); $out = "
    "; foreach ( $all_terms as $t ) : $checked = in_array( $t->term_id, $post_terms) ? 'checked' : ''; $out .= "
  • "; endforeach; $out .= "
"; $out .= wp_nonce_field( plugin_basename( __FILE__ ), 'nonce_name',true,false); $out .= "
"; return $out; }

E sua function process_request() deve ser:

  function process_request(){ // check submission if ( ! isset($_POST['crowd-cat-radio']) || ! is_array($_POST['crowd-cat-radio']) ) return; if ( !isset($_POST['nonce_name']) || !wp_verify_nonce($_POST['nonce_name'],plugin_basename( __FILE__ )) ) { print 'Sorry, your nonce did not verify.'; exit; } else { // continue to process form data // sanitize and check the input $suggested_terms = array_map( 'absint', $_POST['crowd-cat-radio'] ); $post_id = absint( $_POST['crowd-cats-pid'] ); $tax = $_POST['crowd-cats-tax']; if ( ! taxonomy_exists($tax) ) return; // Allow only existing terms. Not sure if this is needed. $args = array( 'hide_empty' => false ); $args = apply_filters( 'mcc_allowed_terms_args', $args, $post_id, $tax ); $args['fields'] = 'ids'; $allowed_terms = get_terms( $tax, $args ); foreach ( $suggested_terms as $key => $term_id ) if ( ! in_array( $term_id, $allowed_terms ) ) unset( $suggested_terms[$key] ); // Add terms to taxonomy $affected_terms = wp_set_object_terms( $post_id, $suggested_terms, $tax, false ); update_term_cache($affected_terms); return $affected_terms; } } 

Eu acho que o seu problema é que você tem No seu código, mas wp_nonce_field() gera o inteiro para você. Dê uma olhada na fonte da sua página; Você provavelmente verá algo como

  

Mude o seu $out para algo como isto:

 $out .= "  " . wp_nonce_field( 'action_name', 'nonce_name' ) . "  ";