我正在创建一个嵌套在 WordPress 网站中的 Angular 应用程序(版本 8)。我正在尝试向插件发出请求以从数据库中获取一些数据。使用 Angular 的 HTTPClient 我得到一个 400 Bad Request。我认为这与无法(或至少不知道如何)将操作传递给 WP 以使 AJAX 代码正常运行有关。
我可以使用 jQuery 的 $.get() 函数并获得正确的响应,但是我很难将数据从我的服务传递到我的组件。
我对我的 Angular 排骨很生疏,所以我确定我做的不对。任何建议或指示将不胜感激!!!
插件的 AJAX 代码:
//UTIL Functions
public function get_categories(){
global $wpdb;
$cat_sql = "SELECT * FROM {$wpdb->prefix}" . SELF::CATEGORY_TABLE;
return $wpdb->get_results($cat_sql);
}
public function ajaxGetCategories(){
$prods = $this->get_categories();
if($prods !== FALSE){
//NEED TO ASSIGN THE RETURNED OBJECT TO AN ARRAY AND PASS THAT DOWN
$prodArray = [];
for($i = 0; $i < count($prods); $i++){
$prodArray[$i]['p_index'] = $prods[$i]->p_index;
$prodArray[$i]['product_name'] = $prods[$i]->product_name;
$prodArray[$i]['product_sections'] = $prods[$i]->product_sections;
$prodArray[$i]['product_imgID'] = $prods[$i]->product_imgID;
}
wp_send_json_success($prodArray);
}else {
wp_send_json_error("Error!");
}
//return $prods;
wp_die();
}
// front end ajax calls
add_action( 'wp_ajax_get_products', array($this,'ajaxGetCategories') );
add_action( 'wp_ajax_nopriv_get_products', array($this,'ajaxGetCategories') );
角服务:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import * as $ from 'jquery';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ProductService {
private params: object = {
'action' : 'get_products'
}
private post_url: string = 'https://MYCOOLSITE.COM/wp-admin/admin-ajax.php';
public products = [];
constructor( ) {
}
public getProducts() {
$.post(this.post_url, this.params, function(data){
if(data.success == true){
var prod = [];
for(var i = 0; i < data.data.length; i++){
prod[i] = [];
console.log("data 1: " + data.data[i] );
for(var prop in data.data[i]){
prod[i][prop] = data.data[i].prop;
}
}
return prod;
} else {
// @TODO - ADD ERROR HANDLING
}
});
}
角组件:
import { Component,OnInit } from '@angular/core';
import {ProductService} from './product.service';
import { Observable } from 'rxjs/Observable';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.sass'],
providers: [ProductService]
})
export class AppComponent implements OnInit{
title = 'Choose a product.';
constructor(private productService: ProductService){
this.productService.getProducts();
}
ngOnInit() {
}
}
至于它所在的代码,我可以将所有数据打印到服务中的控制台,但它永远不会到达组件。
我在服务的 $.get() 中注意到它没有返回产品,我也不能将任何值传递给 this.products (由于范围问题)。但我至少认为它会从函数中返回 prod ......(?)
我试图让 prod 成为一个 observable,但那更糟糕。我认为我最好的选择是使用 Angular 的 http.get(),因为它会自动传递一个 observable,但我无法弄清楚如何将 ajax 操作名称传递给插件以使其成功。我所有的谷歌搜索都在使用 WP API,这对我没有任何好处。