Đặt api WordPress

Một trong nhiều cách sử dụng tuyệt vời cho WordPress REST API là cải thiện màn hình cài đặt plugin hoặc chủ đề của bạn. Sau khi bạn thêm các điểm cuối API REST tùy chỉnh, việc nhận các cài đặt đã lưu qua AJAX và lưu nó qua AJAX — IE mà không cần tải trang bổ sung — sẽ đơn giản hơn

Sử dụng WordPress REST API thay vì admin-ajax không chỉ hiệu quả hơn mà còn cho phép lõi WordPress thực hiện hầu hết các công việc nặng nhọc về mặt vệ sinh và xác thực

Trong bài viết này, chúng tôi sẽ hướng dẫn từng bước để tạo trang biểu mẫu cài đặt và xử lý biểu mẫu đó bằng WordPress REST API

Thêm trang cài đặt của bạn

Trước khi chúng tôi có thể bắt đầu thiết kế trang cài đặt của mình, chúng tôi sẽ cần thêm một menu hoặc mục menu con vào bảng điều khiển WordPress mà bạn có thể đặt biểu mẫu cài đặt trên đó. Trên trang này, bạn sẽ cần tải các tệp CSS và JavaScript

Đây là một lớp học khởi đầu cho điều đó

assets_url = $assets_url;
		add_action( 'admin_menu', array( $this, 'add_page' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'register_assets' ) );
	}
	/**
	 * Add CF Popup submenu page
	 *
	 * @since 0.0.3
	 *
	 * @uses "admin_menu"
	 */
	public function add_page(){
		add_menu_page(
			__( 'Apex Page', 'text-domain' ),
			__( 'Apex Page', 'text-domain' ),
			'manage_options',
			$this->slug,
			array( $this, 'render_admin' ) );
	}
	/**
	 * Register CSS and JS for page
	 *
	 * @uses "admin_enqueue_scripts" action
	 */
	public function register_assets()
	{
		wp_register_script( $this->slug, $this->assets_url . '/js/admin.js', array( 'jquery' ) );
		wp_register_style( $this->slug, $this->assets_url . '/css/admin.css' );
		wp_localize_script( $this->slug, 'APEX', array(
			'strings' => array(
				'saved' => __( 'Settings Saved', 'text-domain' ),
				'error' => __( 'Error', 'text-domain' )
			),
			'api'     => array(
				'url'   => esc_url_raw( rest_url( 'apex-api/v1/settings' ) ),
				'nonce' => wp_create_nonce( 'wp_rest' )
			)
		) );
	}
	/**
	 * Enqueue CSS and JS for page
	 */
	public function enqueue_assets(){
		if( ! wp_script_is( $this->slug, 'registered' ) ){
			$this->register_assets();
		}
		wp_enqueue_script( $this->slug );
		wp_enqueue_style( $this->slug );
	}
	/**
	 * Render plugin admin page
	 */
	public function render_admin(){
		$this->enqueue_assets();
		echo 'Put your form here!';
	}
}

Trong lớp này, tôi đang sử dụng add_menu_page để tạo menu cấp cao nhất, nhưng bạn có thể muốn thay thế add_sub_menu, tùy thuộc vào nhu cầu của bạn. Có hai điều quan trọng khác cần lưu ý

Đầu tiên là cách chúng tôi đang sử dụng wp_localize_script(). Hàm này cung cấp cho bạn cách tạo biến JavaScript phạm vi toàn cầu bằng PHP, bất cứ khi nào tập lệnh được chỉ định trong đối số đầu tiên của nó được tải. Điều này ban đầu được thiết kế để cung cấp các chuỗi đã dịch - được bản địa hóa - cho trình duyệt. Đó là một phần trong cách chúng tôi sử dụng nó — để cung cấp các thông báo lỗi và thành công có thể dịch được. Nhưng nó cũng có thể được sử dụng để chuyển các giá trị động, chẳng hạn như URL cho trang web hiện tại, trong trường hợp này là điểm cuối API REST và nonce. Chúng tôi sẽ cần tất cả những thứ đó trong JavaScript của mình, nhưng nó sẽ khác nhau đối với mọi trang web, vì vậy chúng tôi phải sử dụng PHP để tạo nó một cách nhanh chóng

Ngoài ra, lưu ý rằng URL gốc cho tập lệnh được chuyển vào dưới dạng phụ thuộc vào lớp. Tôi muốn làm điều này vì URL đó có khả năng được sử dụng ở những nơi khác trong plugin hoặc chủ đề và tôi muốn một nơi duy nhất để thay đổi hoặc lọc nó cho toàn bộ plugin

Chúng tôi sẽ cần chỉ định URL đó khi chúng tôi khởi tạo lớp. Một nơi tốt để làm điều đó là trong tệp plugin gốc, vì vậy plugin_dir_url() sẽ tạo đúng URL. Hãy xem tệp plugin chính sẽ thiết lập điều này

Trong phần này, chúng tôi sử dụng hành động “init” để tải lớp này. Tôi đã để lại một trình giữ chỗ cho điểm cuối API REST mà chúng tôi sẽ sử dụng để lưu dữ liệu của mình sau khi màn hình plugin sẵn sàng cho việc đó

Biểu mẫu Cài đặt

Tôi sẽ không tìm hiểu quá sâu về biểu mẫu cài đặt, tôi có thể viết cả một loạt về điều đó. Thay vào đó, hãy chỉ thêm hai trường để xem xét một vài điều quan trọng. Sau đó, chúng ta có thể viết JavaScript để gửi các giá trị biểu mẫu trở lại máy chủ

Đây là phương thức “render_admin”, được cập nhật với một trường có hai trường

/**
	 * Render plugin admin page
	 */
	public function render_admin(){
		$this->enqueue_assets();
		?>
		

Tôi đảm bảo rằng mỗi trường có một ID. Điều này sẽ cho phép tôi nhắm mục tiêu từng mục tiêu với jQuery. val() để lấy giá trị của nó. Điều này cũng quan trọng để giữ ngữ nghĩa HTML của chúng ta, vì nhãn trường phải có thuộc tính for tương ứng với ID trường. Tôi cũng đã cung cấp cho biểu mẫu một ID và thêm một phần tử trống có ID là “phản hồi” để chúng tôi có thể tự động đặt các thông báo lỗi hoặc đã lưu ở đó

Một lần nữa, biểu mẫu của bạn có thể sẽ phức tạp hơn nhiều, nhưng hãy bắt đầu đơn giản

Thêm một tuyến API REST

Trước khi chúng tôi có thể viết bất kỳ JavaScript nào để gửi dữ liệu đến máy chủ thông qua AJAX, chúng tôi cần một tuyến API REST cho nó. Tôi đã viết rất nhiều về điều này, nhưng đáng để thử qua một lộ trình tùy chỉnh rất đơn giản với điểm cuối GET và POST

Tách logic kinh doanh

Tôi thực sự tin rằng các lớp cho các tuyến API REST chỉ nên quan tâm đến các yêu cầu xử lý, chứ không phải logic nghiệp vụ cần thiết cho các yêu cầu đó. Trong trường hợp này, theo “logic nghiệp vụ”, ý tôi là đọc và viết các cài đặt thực tế. Vì vậy, trước tiên, hãy tạo một lớp có thể xử lý điều đó

Lớp này sẽ là một trình bao bọc đơn giản xung quanh get_option() và update_option() với một số xác thực cơ bản. Lớp này có một phương thức get_settings() nhận giá trị đã lưu và sau đó sử dụng wp_parse_args() để điền vào bất kỳ chỉ mục nào còn thiếu của mảng đã lưu mà chúng tôi mong muốn nó có. Nó cũng có phương thức save_settings() để đảm bảo rằng chỉ các khóa trong danh sách trắng của mảng được lưu mới nằm trong mảng cuối cùng được lưu

 'lumber',
		'amount' => 42
	);
	/**
	 * Get saved settings
	 *
	 * @return array
	 */
	public static function get_settings(){
		$saved = get_option( self::$option_key, array() );
		if( ! is_array( $saved ) || ! empty( $saved )){
			return self::$defaults;
		}
		return wp_parse_args( $saved, self::$defaults );
	}
	/**
	 * Save settings
	 *
	 * Array keys must be whitelisted (IE must be keys of self::$defaults
	 *
	 * @param array $settings
	 */
	public static function save_settings( array  $settings ){
		//remove any non-allowed indexes before save
		foreach ( $settings as $i => $setting ){
			if( ! array_key_exists( $setting, self::$defaults ) ){
				unset( $settings[ $i ] );
			}
		}
		update_option( self::$option_key, $settings );
	}
}

Lộ trình API REST

Bây giờ chúng ta có một cách để đọc và ghi các cài đặt mà chúng ta có thể xử lý bằng bất kỳ phương tiện nào, hãy tạo một tuyến API REST hoạt động như một giao diện RESTful cho nó. Tuyến đường này sẽ có các điểm cuối GET và POST

Nếu bạn chưa bao giờ tạo điểm cuối API REST tùy chỉnh, tôi khuyên bạn nên đọc tài liệu. Tôi cũng có một danh sách các liên kết được sắp xếp, bao gồm các bài viết về Mô-men xoắn và các cuộc nói chuyện trên TV WordPress về chủ đề này

Đây là lớp lộ trình API REST

 'POST',
				'callback'        => array( $this, 'update_settings' ),
				'args' => array(
					'industry' => array(
						'type' => 'string',
						'required' => false,
						'sanitize_callback' => 'sanitize_text_field'
					),
					'amount' => array(
						'type' => 'integer',
						'required' => false,
						'sanitize_callback' => 'absint'
					)
				),
				'permissions_callback' => array( $this, 'permissions' )
			)
		);
		register_rest_route( 'apex-api/v1', '/settings',
			array(
				'methods'         => 'GET',
				'callback'        => array( $this, 'get_settings' ),
				'args'            => array(
				),
				'permissions_callback' => array( $this, 'permissions' )
			)
		);
	}
	/**
	 * Check request permissions
	 *
	 * @return bool
	 */
	public function permissions(){
		return current_user_can( 'manage_options' );
	}
	/**
	 * Update settings
	 *
	 * @param WP_REST_Request $request
	 */
	public function update_settings( WP_REST_Request $request ){
		$settings = array(
			'industry' => $request->get_param( 'industry' ),
			'amount' => $request->get_param( 'amount' )
		);
		Apex_Settings::save_settings( $settings );
		return rest_ensure_response( Apex_Settings::get_settings())->set_status( 201 );
	}
	/**
	 * Get settings via API
	 *
	 * @param WP_REST_Request $request
	 */
	public function get_settings( WP_REST_Request $request ){
		return rest_ensure_response( Apex_Settings::get_settings());
	}
}

Hãy xem, các chức năng gọi lại khá đơn giản, vì chúng chỉ bao bọc lớp cài đặt mà tôi đã tạo trong phần trước. Điều quan trọng là phải hiểu rằng theo thiết kế, lớp cài đặt đó không có quyền kiểm tra hoặc vệ sinh. Nhưng kiểm tra quyền và vệ sinh là rất quan trọng

Các điểm cuối API REST này cung cấp rằng. Phương thức POST chỉ định đối số 'sanitize_callback' cho từng trường. Bằng cách đó, tôi có thể tin tưởng rằng dữ liệu được an toàn trước khi chuyển dữ liệu vào. Ngoài ra, cả hai tuyến đều sử dụng “permissions_callback” để chỉ có thể truy cập các tuyến này thông qua những tuyến có khả năng “manage_options”. Bỏ qua một trong hai bước này sẽ rất nguy hiểm

Bây giờ chúng ta chỉ cần khởi tạo lớp này, tại hành động “rest_api_init” để tồn tại các điểm cuối. Đây lại là tệp plugin chính, được sửa đổi để làm điều đó

Sử dụng API REST trong trang Cài đặt của bạn

Bây giờ chúng ta đã có các điểm cuối, hãy đưa chúng vào sử dụng trên trang cài đặt của chúng ta. Chúng tôi sẽ viết hai cuộc gọi AJAX. Cái đầu tiên sẽ nhận các cài đặt đã lưu và cập nhật biểu mẫu với các cài đặt đó. Điều này sẽ được kích hoạt khi tải trang. Cái thứ hai sẽ được kích hoạt bởi nút lưu biểu mẫu và sẽ được sử dụng để cập nhật cài đặt

Trước đó trong hướng dẫn này, chúng tôi đã yêu cầu WordPress tải tệp JavaScript trên trang quản trị này. Bây giờ là lúc để sử dụng tập tin đó

Đây là cuộc gọi AJAX đầu tiên trông như thế nào. Công việc của nó là lấy các cài đặt đã lưu và cập nhật biểu mẫu với các cài đặt đó.

jQuery(function($) {
	
	$.ajax({
		method: 'GET',
		url: APEX.api.url
		beforeSend: function ( xhr ) {
			xhr.setRequestHeader( 'X-WP-Nonce', APEX.api.nonce );
		}
	}).then( function ( r ) {
		if( r.hasOwnProperty( 'industry' ) ){
			$( '#industry' ).val( r.industry );
		}

		if( r.hasOwnProperty( 'amount' ) ){
			$( '#amount' ).val( r.amount );
		}
	})

});

Lưu ý hai điều quan trọng ở đây. Đầu tiên, tôi sử dụng đối tượng toàn cầu APEX đã được thiết lập trước đó với wp_localize_script() để báo cho jQuery biết URL nào cần yêu cầu. Ngoài ra, tôi đang sử dụng phương thức beforeSend() để thêm một tiêu đề với nonce chứa trong đối tượng đó. Nếu không có điều đó, trong quá trình xử lý yêu cầu API, người dùng sẽ không được coi là đã đăng nhập và do đó, quá trình kiểm tra quyền của chúng tôi sẽ không thành công

Sau khi hoàn thành yêu cầu API, các cài đặt sẽ được thêm vào các trường biểu mẫu bằng jQuery. giá trị(). Để đảm bảo an toàn, tôi đảm bảo rằng họ đang phản ứng bằng cách sử dụng Object. hasOwnProperty(). Đây là xác thực quan trọng nhưng không mở rộng quy mô tốt khi số lượng cài đặt tăng lên — một trong nhiều lý do tôi sử dụng VueJS cho loại việc này

Bây giờ khi bạn tải trang, nó sẽ nhận được các cài đặt đã lưu, có thể là các giá trị mặc định tại thời điểm này và cập nhật biểu mẫu. Điều đó tốt, nhưng điểm thực sự của tất cả những điều này là có thể cập nhật cài đặt. Vì vậy, chúng tôi sẽ cần lệnh gọi AJAX thứ hai, cuộc gọi này sẽ chạy yêu cầu POST khi biểu mẫu được gửi

Đây là JavaScript được cập nhật với lệnh gọi AJAX lưu

jQuery(function($) {

	$.ajax({
		method: 'GET',
		url: APEX.api.url,
		beforeSend: function ( xhr ) {
			xhr.setRequestHeader( 'X-WP-Nonce', APEX.api.nonce );
		}
	}).then( function ( r ) {
		if( r.hasOwnProperty( 'industry' ) ){
			$( '#industry' ).val( r.industry );
		}

		if( r.hasOwnProperty( 'amount' ) ){
			$( '#amount' ).val( r.amount );
		}
	});

	$( '#apex-form' ).on( 'submit', function (e) {
		e.preventDefault();
		var data = {
			amount: $( '#amount' ).val(),
			industry: $( '#industry' ).val()
		};

		$.ajax({
			method: 'POST',
			url: APEX.api.url,
			beforeSend: function ( xhr ) {
				xhr.setRequestHeader('X-WP-Nonce', APEX.api.nonce);
			},
			data:data
		}).then( function (r) {
			$( '#feedback' ).html( '

' + APEX.strings.saved + '

' ); }).error( function (r) { var message = APEX.strings.error; if( r.hasOwnProperty( 'message' ) ){ message = r.message; } $( '#feedback' ).html( '

' + message + '

' ); }) }) });

Cuộc gọi thứ hai này rất giống nhau, ngoại trừ nó sử dụng POST và được bao bọc trong một bao đóng ràng buộc với sự kiện gửi biểu mẫu. Bằng cách đó, nó sẽ chạy khi biểu mẫu gửi và chúng tôi có thể ngăn hành động mặc định của sự kiện đó xảy ra

Những gì bạn nên xem ở đây là các phương pháp thành công và lỗi. Chúng được sử dụng để thêm tin nhắn dưới dạng văn bản, được bản địa hóa trong APEX. đối tượng string vào phần tử #feedback. Thông báo "lỗi" trong đối tượng đó rất chung chung. Nhưng hầu hết các yêu cầu không thành công sẽ tạo phản hồi bằng tin nhắn. Vì vậy, nếu điều đó được đặt, chúng tôi sẽ sử dụng điều đó thay thế

Biến nó thành của riêng bạn

Khi bạn có điểm xuất phát tốt, bạn có thể cập nhật các trường trong biểu mẫu để phù hợp với nhu cầu của mình. Ngoài ra, có lẽ bạn nên sử dụng khung JavaScript để đơn giản hóa điều này, bởi vì khi biểu mẫu của bạn trở nên phức tạp hơn, bạn sẽ ngày càng làm được nhiều việc hơn với jQuery, điều này gây khó khăn cho việc quản lý và sẽ đơn giản hơn cũng như cung cấp trải nghiệm người dùng tốt hơn

Bài viết này đã chỉ cho bạn tất cả các phần của việc thêm trang cài đặt WordPress sử dụng WordPress REST API. Chúng tôi đã thêm một trang menu, thêm JavaScript và CSS vào hàng đợi, thêm một lớp để đọc và ghi cài đặt, thêm hai điểm cuối API REST làm giao diện RESTful và bảo mật cho các cài đặt đó, đồng thời sử dụng jQuery AJAX để cập nhật cài đặt dựa trên biểu mẫu cài đặt của chúng tôi. Đó là rất nhiều, nhưng tôi hy vọng bạn đã thấy cách bạn có thể cải thiện các trang cài đặt của riêng mình bằng cách sử dụng những điều cơ bản này hoặc xây dựng trang của riêng bạn từ đầu và phát triển từ đó

Cài đặt API trong WordPress là gì?

API Cài đặt, được thêm vào WordPress 2. 7, cho phép các trang quản trị chứa các biểu mẫu cài đặt được quản lý bán tự động . Nó cho phép bạn xác định các trang cài đặt, các phần trong các trang đó và các trường trong các phần đó. Các trang cài đặt mới có thể được đăng ký cùng với các phần và trường bên trong chúng.

Làm cách nào để thiết lập API trong WordPress?

Cách bắt đầu sử dụng API WordPress REST (trong 3 bước) .
Bước 1. Truy cập API REST. Bạn có thể 'truy cập' WordPress REST API từ bất kỳ ứng dụng nào có thể gửi điểm cuối HTTP. .
Bước 2. Tìm nạp một bài đăng cụ thể bằng API REST. .
Bước 3. Thêm siêu dữ liệu vào một bài viết cụ thể

Có API cho WordPress không?

WordPress đã có nhiều API , cho những thứ như plugin, cài đặt và mã ngắn. Chúng có thể được các nhà phát triển plugin và chủ đề sử dụng để tương tác với lõi WordPress và biến mọi thứ thành hiện thực (như tạo mã ngắn và thêm màn hình cài đặt vào quản trị viên WordPress).

WordPress có cho phép tích hợp API không?

API WordPress REST là một giao diện cho phép các ứng dụng bên ngoài truy cập vào dữ liệu và chức năng của WordPress CMS . Công cụ này cho phép các nhà phát triển tích hợp WordPress vào các trang web và ứng dụng web của bên thứ ba mà không cần đăng nhập vào WordPress.