AJAX response, edit tags

时间:2016-09-30 作者:JMau

在使用诸如check_admin_referercheck_ajax_referer ?

我(使用这些过滤器)做了一些调整,以防止用户删除一些非常重要且不能删除的术语。但它不断告诉我“未知错误”,这远远不够清楚。

任何暗示都很酷。

目前,我正在使用wp\\u die(“此术语不能删除”),我想知道如何在AJAX响应中注入此消息。

7 个回复
最合适的回答,由SO网友:LeMike 整理而成

等待12月6日的WordPress 4.7。它几乎是内置的。

如果我没弄错的话,那么你会想阻止删除某些术语。我已经为WP 4.7编写了一个代码片段

add_filter(
  \'user_has_cap\',
  function ( $allcaps, $caps, $args ) {
    if ( ! isset( $args[0] ) || \'delete_term\' != $args[0] ) {
      // not the deletion process => ignore
      return $allcaps;
    }

    $term = get_term( $args[2] );

    // HERE YOU\'LL LIKE TO PUT YOUR LOGIC INSTEAD OF THIS:
    if ( $term->count <= 0 ) {
      return $allcaps;
    }

    // for all other cases => reject deletion
    return [ ];
  },
  10,
  3
);
有关更多详细信息,请阅读https://wp-includes.org/536/capabilities-taxonomies-terms/#Preventnon-empty_categories_from_deletion

SO网友:T.Todua

另一个答案与AJAX/JAVASCRIPT无关。

相反,请添加以下代码:

add_action( \'pre_delete_term\', \'myfunc\', 10,2  );
function myfunc($term, $taxonomy){
  //var_dump($term);   var_dump($taxonomy);
  if($taxonomy ==\'category\' && $term==745 ){
     die(\'not allowed\');
  }
}
请将745更改为所需的类别id。

SO网友:stims

这是我的第一个答案,希望有帮助。

如果我正确理解了您的问题,您可能想知道如果check_ajax_referrer 退货false.

查看code reference 您将看到函数激发一个名为check_ajax_referer, 就在它停止代码执行之前,如果为false。我们要做的是使用此操作覆盖假nonce结果的结果。

function fn_name($action, $result){

    //  check if $result, passed from core function, is false
    //  alternately you can check for action if only needed for a specific ajax request
    //   For example: 
    //       if($action == \'the_action_name\' && false === $result)

    if ( false === $result ) {

        //  use built in send function to return json to client,
        //  wp_send_json has wp_die() built-in

        wp_send_json(\'This term cannot be deleted\');
    }

    //  return to core function if true
    return $result;
}

add_action(\'check_ajax_referer\', \'fn_name\', 10, 2);
我很抱歉,如果这个答案太冗长,我想尽可能彻底。

SO网友:T.Todua

每个AJAX调用都有类似的结构:

jQuery.post(ajaxurl,  { 
            action: "something_namee", 
            parameter1: "blabla" ,
            parameter2: "blabla222" ,
            ........ 
在PHP端,您应该创建wp_ajax_ 行动,紧随其后something_namee:

add_action(\'wp_ajax_something_namee\',\'myfunc123\',1);
function myfunc123(){
    //var_dump($_POST);
    if(!EMPTY($_POST[\'parameter1\']) && $_POST[\'parameter1\']==53){
        die("this term id cant be deleted");
    }
}
另外,只需更改参数1和53,并调用真正的参数(您可以通过取消注释找出从AJAX传递的参数var_dump 上文)

p、 s.2。然而,我建议根本不要依赖AJAX调用!因为删除类别可以做很多不同的事情,所以上面的方法没有帮助。我将发布另一个答案,这是推荐的。

SO网友:darrinb

我的一个插件中有这个:

/**
 * Prevents deletion of term
 *
 * Applies filter "atf_locks_term_delete_cap" to allow other plugins to filter the capability.
 *
 * @uses Adv_Term_Fields_Locks::get_prevent_msg()
 *
 * @access public
 *
 * @since 0.1.0
 *
 * @param int    $term_id  Term ID.
 * @param string $taxonomy Taxonomy Name.
 *
 * @return mixed int    $term_id If current user can delete the term or term is not locked.
 *               wp_die()  On AJAX calls: If current user can\'t delete term or user is not detected.
 */
public function maybe_prevent_term_delete( $term_id, $taxonomy )
{
    // If no lock, return term ID
    if ( ! $lock = get_term_meta( $term_id, $this->meta_key, true ) ) {
        return $term_id;
    };

    $cap = apply_filters( "atf_locks_term_delete_cap", "manage_others_term_locks" );
    $user_can_delete = $this->_user_can( $cap, $term_id, $taxonomy, $lock );

    if ( ! $user_can_delete ) :
        if ( defined(\'DOING_AJAX\') && DOING_AJAX ) {
            wp_die( -1 );
        } else {
            $_msg = $this->get_prevent_msg( $action = \'delete\' );
            wp_die( $_msg, 403 );
        };
    endif;

    return $term_id;
}
这就是所谓的:

add_action( \'pre_delete_term\', array( $this, \'maybe_prevent_term_delete\' ), 99, 2 );

这个pre_delete_filter 在删除任何术语之前调用。为了防止删除,您可以挂接到类似于我在上面的类方法中所做的操作。

问题是,WP不允许自定义响应。因为这是一个ajax调用,所以它只查找“1”、“0”或“-1”。

退房wp_ajax_delete_tag() 在里面/wp-admin/includes/ajax-actions.php 看看我指的是什么。

SO网友:scott

每个AJAX调用都使用回调函数来处理返回的数据。只需使用.fail 回调:

jQuery.post( ajaxurl,
            { //your data here },
            function( content ) {
               var myContent = JSON.parse(content);
               // success! do something with content
            } ).fail( fucntion( msg ) { alert( msg );
            });
这就是我将AJAX失败消息传递给用户界面的方式。

SO网友:garprogram

通过ajax向网页发送响应。

add_action(\'wp_ajax_my_action\',\'my_function\');

function my_function(){
    if( true === $value ){   // make test
       echo \'Is true\';       // send string response to web page
       wp_die();             // Finish response
    } else {
       echo \'Is not true\';   // send string response to web page
       wp_die();             // Finish response
    }
}
您还可以发送json响应:

https://codex.wordpress.org/Function_Reference/wp_send_json :将JSON响应发送回AJAX请求,然后die()。

function my_function(){
    $response_true = array(\'response\'=> \'Success\',\'reason\'=>\'is true\');
    $response_not_true = array(\'response\'=> \'Error\',\'reason\'=>\'is not true\');
    if( true === $value ){   // make test
       wp_send_json($response_true);       // send json response 
   //    wp_die();             // not necessary
    } else {
       wp_send_json($response_not_true);   // send json response 
   //    wp_die();             // not necessary
    }
}

相关推荐

Select2 AJAX和WP查询返回全部,不筛选

所以我在这里有点困惑。我经常使用Select2/AJAX/WP\\u查询来搜索和检索默认的WP帖子类型和我自己的自定义帖子类型。在过去几年中,我构建的几乎每个站点都至少包含一个实现。但是,我目前正在一个网站上搜索自定义帖子类型的结果,它只是返回所有内容。没有发生过滤。这是一个计划工具,管理员正在为一年中的每个月制定一个计划(自定义帖子类型)。时间表的标题为“月-年”,即。\'January 2022\'.问题是,如果您搜索“一月”,例如,您将得到返回的每个存在的时间表。包括2022年2月、2021 6月等