在WordPress Multisite中使用Typeahead Ajax的ParseError

时间:2015-12-29 11:06:30

标签: php jquery json ajax wordpress

我正在尝试为WordPress创建自定义MultiBlog搜索,您可以在其中搜索特定的字词,标签,作者,类别,日期范围和评论。

您可以在每个博客中搜索,只搜索选定的博客,或只搜索一个博客。结果很好,但我在使用TypeHead自动完成时遇到了一些问题。

对于标签,类别和作者,我只能通过Ajax使用TypeHead。

我确定我从HTML中获取所有值,所以这就是我的JS:

var form = $('#multiselect-search-form');
   $('#categories').typeahead({
        source: function(query, process) {
            $.ajax({
                url: BaseURL + 'wp-content/plugins/multiblogselect/categories-search.php',
                type: 'POST',
                data: form.serialize(),
                dataType: 'JSON',
                async: true,
                success: function(data) {
                    categories = [];
                    map = {};
                    $.each(data, function (i, categorie) {
                        map[categorie.name] = categorie;
                        categories.push(categorie.name);
                    });
                    process(categories);
                    console.log(categories);
                },
                error: function(req, err){ console.log('Ajax error ' + err); }
            });
        }
    });

实际上,当我只看一个博客(无论如何,只选择一个)时,它的工作正常。但是,当我尝试选择超过1个博客时,我发现了解析错误。

所以这是我的PHP:

获得价值观很好,我将它们发送给JS。 $ multiblogselect返回数组中博客的ID。

if (is_array($multiblogsselect)){
        $multiselect = count($multiblogsselect);
        if ($multiselect === 1) {
            foreach ($multiblogsselect as $key => $value){
                if ($value != 1 && $value > 0) {
                    $tablePrefix = $wpdb->base_prefix.$value.'_';
                } else{
                    $tablePrefix = $wpdb->base_prefix;
                }

                $resultCategories = getPostCategories($tablePrefix, $categories);
                echo json_encode(array_values($resultCategories));
            }
        } else {
            $resultCategories = array();
            for ($i=1; $i<=$multiselect; $i++) {
                if ($i != 1 && $i > 0) {
                    $tablePrefix = $wpdb->base_prefix.$i.'_';
                } else{
                    $tablePrefix = $wpdb->base_prefix;
                }
                $resultCategories = array_merge_recursive($resultCategories, getPostCategories($tablePrefix, $categories));
            }
            echo json_encode(array_values($resultCategories));
        }
}

所以我可以使用循环中的任何前缀在数据库中搜索

    function getPostCategories($tablePrefix, $categories){
    //object_id in term_relationships is post_id
    global $wpdb;
    $queryCategories = "SELECT name
                    FROM ".$tablePrefix."term_relationships
                    JOIN ".$tablePrefix."term_taxonomy
                    ON ".$tablePrefix."term_relationships.term_taxonomy_id = ".$tablePrefix."term_taxonomy.term_taxonomy_id
                    JOIN ".$tablePrefix."terms
                    ON ".$tablePrefix."terms.term_id = ".$tablePrefix."term_taxonomy.term_id
                    WHERE ".$tablePrefix."terms.name LIKE '%".$categories."%'
                    AND ".$tablePrefix."term_taxonomy.taxonomy = 'category'
                    ";
    $resultCategories = $wpdb->get_results( $queryCategories );
    return $resultCategories;
}

因此,当我只在一个博客中搜索时,它可以正常工作,但如果我选择多个博客(获得ParseError)则不行。

有什么想法吗?

编辑:我已经添加&#34;用于&#34;循环,所以我不再有parseerror了。但是,多个博客搜索时返回的数组为空。 array_merge in cause?

1 个答案:

答案 0 :(得分:0)

试试这个语法:

if (is_array($multiblogsselect)){

    $multiselect = count($multiblogsselect);

    if ($multiselect === 1) {
        foreach ($multiblogsselect as $key => $value){
            if ($value != 1 && $value > 0) {
                $tablePrefix = $wpdb->base_prefix.$value.'_';
            } else {
                $tablePrefix = $wpdb->base_prefix;
            }

            $resultCategories = getPostCategories($tablePrefix, $categories);
            echo json_encode(array_values($resultCategories));
        }
    } else {
        $resultcategories = array();
        foreach ($multiblogsselect as $key => $value) {
          if ($value == 1) {
            $resultCategories[$key] = getPostCategories($tablePrefix = $wpdb->base_prefix, $categories);
          } else {
            $resultCategories[$key] = getPostCategories($tablePrefix = $wpdb->base_prefix.$value.'_', $categories);
          }
        }
    echo json_encode(array_values($resultCategories));
    }
}