Tải bản đầy đủ - 0 (trang)
Giới thiệu tổng quát về Wordpress

Giới thiệu tổng quát về Wordpress

Tải bản đầy đủ - 0trang

3



thức POST, và đây là nguyên lý khi gọi hàm. Trong ví dụ sau đây gửi n ội dung xml

chứa thông tin gọi hàm vào xmlrpc wordpress server.





system.listMethods







Thẻ methodName xác định tên phương thức thu ộc namespace system.

WordPress xmlrpc cung cấp sẵn các namespace: system, demo, pingback, mt,

metaWeblog, blogger, wp.

Tham số được sử dụng trong hàm, xác định bởi thẻ params, hàm listMethods khơng

có đối số do đó cung cấp thẻ trống

Hàm Kết quả trả về danh sách cách hàm được sử dụng.

1.3. WordPress XMLRPC Server



Đăng ký hàm xmlrpc mới

Wordpress xmlrpc api có filter xmlrpc_methods giúp bạn tạo phương thức riêng.

Đăng ký hàm rpc với đoạn code sau, copy vào theme functions.php

add_filter( 'xmlrpc_methods', 'add_xml_rpc_methods' );

function add_xml_rpc_methods( $methods ) {

$methods['frs.helloWorld'] = 'hello_world';

//Where frs.helloWorld is

the XML-RPC method name, and hello_world is the callback, namespace 'frs' for any

you want.

return $methods;

}



Ở ví dụ trên, chúng ta đăng ký hàm helloWorld thuộc namespace mới frs, và khai

báo lời gọi hàm callback hello_worldcho hàm helloWorld.

Phần định nghĩa hàm callback. Xem ví dụ mẫu:

function hello_world($params){

global $wp_xmlrpc_server;

$arg1

= $params[1];

return "Hello ".$wp_xmlrpc_server->escape( $arg1 );

}



4



*Chú ý: Hàm cần trả về giá trị, giá trị này sẽ được lấy khi gọi hàm. Không s ử

dụng echo, print để xuất chuỗi ra màn hình.

Xóa hàm rpc

Tương tự như cách tạo hàm, sử dụng xmlrpc_methods để xóa các hàm khơng

mong muốn. Thêm vào functions.php

function mynamespace_remove_xmlrpc_methods( $methods ) {

unset( $methods['demo.addTwoNumbers'] );

unset( $methods['frs.helloWorld'] );

return $methods;

}

add_filter( 'xmlrpc_methods', 'mynamespace_remove_xmlrpc_methods');



1.4. XMLRPC Client

1.4.1. Tạo lớp sử lý gọi hàm từ XMLRPC Server.



Tạo lớpXMLRPC_Client với nội dung sau:

/*create XML-RPC PHP client*/

class XMLRPC_Client {

private $url;

function __construct( $url ) {

$this->url = $url;

}

/**

* Call the XML-RPC method named $method and return

* the results, or die trying!

*

* @param string $method XML-RPC method name

* @param mixed ... optional variable list of parameters

* to pass to XML-RPC call

*

* @return array result of XML-RPC call

*/

public function call() {

// get arguments

$params = func_get_args();

$method = array_shift( $params );

$post = xmlrpc_encode_request( $method, $params );



5

$ch = curl_init();

// set URL and other appropriate options

curl_setopt( $ch, CURLOPT_URL,

$this->url );

curl_setopt( $ch, CURLOPT_POST,

true );

curl_setopt( $ch, CURLOPT_POSTFIELDS,

$post );

curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

// issue the request

$response = curl_exec( $ch );

$response_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );

$curl_errorno = curl_errno( $ch );

$curl_error = curl_error( $ch );

curl_close( $ch );

// check for curl errors

if ( $curl_errorno != 0 ) {

die( "Curl ERROR: {$curl_errorno} - {$curl_error}n" );

}

// check for server errors

if ( $response_code != 200 ) {

die( "ERROR: non-200 response from server: {$response_code} - {$response}n"

);

}

return xmlrpc_decode( $response );

}

}



1.4.2. Gọi hàm rpc



Kết nối tới XMLRPC Server sử dụng class XMLRPC_Client. Tạo instance của

classXMLRPC_Client và gọi hàm rpc trên XMLRPC Server bởi phương thức call.

//call method

$client = new XMLRPC_Client( "http://127.0.0.1:81/wordpress/xmlrpc.php" );

$available_methods = $client->call( 'system.listMethods' );

print_r( $available_methods );



Lợi ích của XMLRPC là bạn có thể gọi nhiều hàm trên m ột k ết n ối XMPRPC, nh ư

ở đây chúng ta có thể gọi tiếp hàm demo.sayHello.

$test= $client->call( 'demo.sayHello' );

print_r($test);



1.4.3. Xây dựng hàm RPC



6



Lấy giá trị tham số truyền vào hàm

function hello_world( $params ) {

global $wp_xmlrpc_server;

$blog_id = (int) $params[0]; // tham số đầu tiên không được sử dụng, tham số

này trả về id của blog wordpress (built in XML-RPC actions)

//tham số 1

$username = $params[1];

$password = $params[2];

//tham số 2

$args

= $params[3]; //tham số 3

}



Truyền tương tương các tham số vào phương thức $client->call.

$client->call( 'frs.helloWorld', 1, 'xmlrpc-user', 'xmlrpc-pass', array( 'name' =>

'Justin' ) );



Như



vậy $params[1] có giá

và $params[3] là mảng còn lại.



trị



‘xmlrpc-user’, $params[2] =



‘xmlrpc-pass’



Escape giá trị tham số chuỗi.

$params[1]=$wp_xmlrpc_server->escape( $params[1] );



1.4.4. Xử lý lỗi



Một ví dụ về cách sử lý lỗi trong hàm rpc, đoạn code này ki ểm tra ng ười dùng

nếu khơng có quyền chỉnh sửa bài viết, thì xuất lỗi 403 kèm theo tin nhắn.

function hello_world( $params ) {

...

// check for edit_posts capability (requires contributor role)

// (obviously not required for this simple example, but just for demonstration

purposes)

if ( ! current_user_can( 'edit_posts' ) )

return new IXR_Error( 403, __( 'You are not allowed access to details about

orders.' ) );

...

}



Ví dụ khác sử lý lỗi 500 (thiếu tham số).

function hello_world( $params ) {

...

$args = $params[3]; //giả sử tham số này là mảng

// required parameter



7

if ( ! isset( $args['name'] ) ) return new IXR_Error( 500, __( "Missing parameter

'name'" ) );

...

}



Ví dụ:

$client->call( 'frs.helloWorld', 1, 'xx', 'yy', array( 'age' => '23' ) );



Ví dụ trên truyền thiếu tham số ‘name’ vào hàm helloWorld, ->gặp lỗi 500.

1.4.5. Tạo phiên làm việc của user (verify credentials)



WordPress RPC API có đối tượng global $wp_xmlrpc_server giúp hàm sử dụng kết

nối vào hệ thống wordpress api. Đăng nhập tài khoản user với phương thức login.

function hello_world( $params ) {

global $wp_xmlrpc_server;

...

$username = $params[1];

$password = $params[2];

// verify credentials

if ( ! $wp_xmlrpc_server->login( $username, $password ) ) {

return $wp_xmlrpc_server->error;

}

...

}



Các tin nhắn lỗi trong quá trình sử dụng wordpress api được lưu tại

biến $wp_xmlrpc_server->error.

Ví dụ gọi hàm wp.getCommentCount để đếm comments của user. Như vậy chúng

ta cần sử dụng phiên làm việc của user.

//requires a WordPress username and password to execute

$client = new XMLRPC_Client( "http://localhost/wordpress/xmlrpc.php" );

$comment_count = $client->call( 'wp.getCommentCount', 1, 'user1', '123456' );

print_r( $comment_count );



1.4.6. Gọi hàm RPC khác từ một hàm RPC



Thực thi action xmlrpc_call với tên hàm cần gọi. Bằng cách này cho phép gọi hàm

rpc trong hàm rpc, không cần gọi thêm một phương th ức $client->call. Điều này rất

hữu ích vì đơi khi bạn cần gọi hàm trước khi sử lý đến 1 lệnh tiếp theo.



8

function hello_world( $params ) {

...

do_action( 'xmlrpc_call', 'system.listMethods' );

...

}



1.5. Jwordpress



Trong bài tập này, ta không sử dụng trực tiếp XML/PRC trên Java mà thông qua

một thư viện API nhỏ, mã nguồn mở gọi là Jwordpress. API này được cung c ấp t ại

https://code.google.com/p/wordpress-java/

Giải thích về API được cung cấp tại đường dẫn: http://wordpressjava.googlecode.com/svn/trunk/doc/index.html



9



2. Framework Jena



Trong xây dựng các ứng dụng dựa trên công nghệ Semantic web, đ ể có th ể th ực

hiện các thao tác như đọc/xuất, hay thực hi ện các truy v ấn trên m ột tài li ệu có mơ

tả ngữ nghĩa dạng RDF ta có thể sử dụng các công cụ như Jena hoặc Sesame. M ặc

dù hiện nay Sesame đã được đẩy mạnh phát triển và ngày càng được quan tâm t ừ

phía người sử dụng, nhưng theo chúng tơi, với tính năng tốt và tài li ệu API rõ ràng,

Jena vẫn thích hợp trong triển khai các ứng dụng hướng đến cơng ngh ệ web ngữ

nghĩa còn mới mẻ này.

Jena (http://jena.sourceforge.net) là một công cụ mã nguồn mở hàng đ ầu đ ể

triển khai Web ngữ nghĩa cho các lập trình viên Java, được phát tri ển b ởi HP Labs

Semantic Web Research (http://www.hpl.hp.com/semweb). Jena là một Java

Framework dùng để xây dựng các ứng dụng Web ngữ nghĩa. Jena cung cấp mơi

trường lập trình cho RDF, RDFS, OWL và SPARQL - ngôn ngữ truy v ấn cho RDF. Jena

bao gồm các thành phần và tính năng sau:

-



-



RDF API: Giao diện lập trình cho RDF.

OWL API: Giao diện lập trình cho OWL.

Xuất và đọc các file RDF theo dạng RDF/XML, N3 và N-Tribles.

Cho phép lưu trữ trong bộ nhớ, lưu trữ cố định trong các tập tin đ ơn hay trong

các hệ quản trị cơ sở dữ liệu (MySQL, HSQLDB, PostgreSQL, Oracle, Microsoft

SQL Server).

Hệ truy vấn SPARQL.



2.1. RDF API

RDF API: Jena là một API trong ngôn ngữ l ập trình Java, t ạo và x ử lý các bi ểu đ ồ

RDF, có thể tạo mới hoặc chỉnh sửa từ những mơ hình đã có. Jena có các l ớp đ ối

tượng biểu diễn đồ thị, tài nguyên và thuộc tính, literal và các gói chứa interface t ạo

đồ thị, dùng tạo mơ hình dữ liệu RDF, đọc và ghi các file RDF, truy xu ất, li ệt kê các

phát biểu trong mơ hình dữ liệu RDF.



10



2.2. OWL API

OWL API: OWL là mở rộng của RDF. OWL liên quan tới các l ớp và giao di ện ho ặc

sử dụng các lớp, giao diện của RDF API.

-



Properties phân ra thành: Datatype properties, Object properties, Symmetric,

Functional, InverseFunctional…



-



Các tài nguyên ontology: các lớp và các thể hiện



-



Quan hệ lớp cha lớp con



-



Quan hệ tương đương, tách rời (Equivalency/Disjointness)



-



Ràng buôc trên

restrictions,…)



-



OWL API cung cấp các lớp và giao diện thể hiện tất cả các lĩnh v ực c ủa ngôn

ngữ OWL.Các lớp và giao diện này nằm trong package com.hp.hpl.jena.ontology.



-



OntModel là interface phổ biến nhất được sử dụng để quản lý các ontology.

OntModel chứa các ontology statement, được sử dụng đ ể lấy các tài nguyên t ồn

tại (Class, individual, properties) hoặc tạo một ontology statement m ới.



-



Các Class được thể hiện bởi OntClass. Ở đó, các phương th ức của OntClass có th ể

được sử dụng để xem các thể hiện, lớp con, lớp cha, quan h ệ gi ữa class v ới th ể

hiện lớp hoặc để xác nhận quan hệ lớp cha lớp con. Các class có th ể được gán

nhãn dưới các thể hiện được phân loại: UnionClass, IntersectionClass,

EnumeratedClass, ComplementClass. OWL API cung cấp cách xác đ ịnh xem m ột

lớp thuộc phân loại nào trong nhóm trên. OntModel cung cấp các ph ương th ức

để xây dựng các định nghĩa phức tạp này.



-



Các properties được thể hiện bởi OntProperty. OntProperty cung cấp các

phương thức xác định các domain và range của properties cũng như xác đ ịnh

loại property: DatatypeProperty,

ObjectProperty,

SymmetricProperty,

FunctionProperty.



các



properties



(AllValuesFrom,



Cardinality



Ví dụ về Class:

// Create an empty ontology model

OntModel ontModel = ModelFactory.createOntologyModel();



11



String ns = new String(“http://www.example.com/onto1#”);

String baseURI = new String(“http://www.example.com/onto1”);

Ontology onto = ontModel.createOntology(baseURI);

// Create ‘Person’, ‘MalePerson’ and ‘FemalePerson’ classes

OntClass person = ontModel.createClass(ns + "Person");

OntClass malePerson = ontModel.createClass(ns + "MalePerson");

OntClass femalePerson = ontModel.createClass(ns + "FemalePerson");

// FemalePerson and MalePerson are subclasses of Person

person.addSubClass(malePerson);

person.addSubClass(femalePerson);

// FemalePerson and MalePerson are disjoint

malePerson.addDisjointWith(femalePerson);

femalePerson.addDisjointWith(malePerson);

Ví dụ về datatype property:

// Create datatype property 'hasAge'

DatatypeProperty hasAge =

ontModel.createDatatypeProperty(ns + "hasAge");

// 'hasAge' takes integer values, so its range is 'integer'

// Basic datatypes are defined in the ‘vocabulary’ package

hasAge.setDomain(person);

hasAge.setRange(XSD.integer); // com.hp.hpl.jena.vocabulary.XSD

// Create individuals

Individual john = malePerson.createIndividual(ns + "John");

Individual jane = femalePerson.createIndividual(ns + "Jane");

Individual bob = malePerson.createIndividual(ns + "Bob");

// Create statement 'John hasAge 20'

Literal age20 =

ontModel.createTypedLiteral("20", XSDDatatype.XSDint);

Statement johnIs20 =

ontModel.createStatement(john, hasAge, age20);

ontModel.add(johnIs20);

Ví dụ về Object property:

// Create object property 'hasSibling'



12



ObjectProperty

"hasSibling");



hasSibling



=



ontModel.createObjectProperty(ns



+



// Domain and Range for 'hasSibling' is 'Person'

hasSibling.setDomain(person);

hasSibling.setRange(person);

// Add statement 'John hasSibling Jane‘

// and 'Jane hasSibling John'

Statement siblings1 = ontModel.createStatement(john, hasSibling,

jane);

Statement siblings2 = ontModel.createStatement(jane, hasSibling,

john);

ontModel.add(siblings1);

ontModel.add(siblings2);

Ví dụ về Property Restriction

// Create object property ‘hasSpouse’

ObjectProperty hasSpouse = ontModel.createObjectProperty(ns +

"hasSpouse");

hasSpouse.setDomain(person);

hasSpouse.setRange(person);

Statement spouse1 = ontModel.createStatement(bob, hasSpouse,

jane);

Statement spouse2 = ontModel.createStatement(jane, hasSpouse,

bob);

ontModel.add(spouse1);

ontModel.add(spouse2);

// Create an AllValuesFromRestriction on hasSpouse:

// MalePersons hasSpouse only FemalePerson

AllValuesFromRestriction onlyFemalePerson =

ontModel.createAllValuesFromRestriction(null,

femalePerson);



hasSpouse,



//

A

MalePerson

can

have

at

most

one

spouse

MaxCardinalityRestriction

MaxCardinalityRestriction hasSpouseMaxCard =

ontModel.createMaxCardinalityRestriction(null, hasSpouse, 1);



->



13



// Constrain MalePerson with the two constraints defined above

malePerson.addSuperClass(onlyFemalePerson);

malePerson.addSuperClass(hasSpouseMaxCard);

Ví dụ về định nghĩa việc liên kết giữa các class:

// Create class ‘MarriedPerson’

OntClass

marriedPerson

=

ontModel.createClass(ns

"MarriedPerson");

MinCardinalityRestriction mincr =

ontModel.createMinCardinalityRestriction(null, hasSpouse, 1);



+



// A MarriedPerson ó A Person, AND with at least 1 spouse

// A list must be created, that will hold the Person class

// and the min cardinality restriction

RDFNode[] constraintsArray = { person, mincr };

RDFList constraints = ontModel.createList(constraintsArray);

// The two classes are combined into one intersection class

IntersectionClass ic =

ontModel.createIntersectionClass(null, constraints);

// ‘MarriedPerson’ is declared as an equivalent of the

// intersection class defined above

marriedPerson.setEquivalentClass(ic);

2.3. RDF

Thông qua Ontology API, Jena hướng tới việc cung cấp giao di ện l ập trình phù

hợp cho việc phát triển ứng dụng ontology độc lập với ngôn ngữ ontology mà b ạn

đang sử dụng trong ngơn ngữ lập trình của bạn. Một trong những lý do chính xây

dựng các ứng dụng dựa trên ontology là sử dụng b ộ suy di ễn đ ể rút ra nh ững đi ều

đúng đắn thêm về các khái niệm mà bạn đang mơ hình hố. Có r ất nhi ều ki ểu l ập

luận tự động và rất nhiều thuật toán lập luận khác nhau. Jena cũng h ỗ tr ợ r ất

nhiều bộ lập luận thông qua inference API. Một đặc đi ểm chung của b ộ l ập lu ận

Jena là chúng tạo ra một mơ hình RDF mới đ ể ch ứa các b ộ ba dữ li ệu đ ược rút ra t ừ

việc suy luận cũng như các bộ ba dữ liệu trong mơ hình c ơ b ản. Ontology API khai



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Giới thiệu tổng quát về Wordpress

Tải bản đầy đủ ngay(0 tr)

×
x