0

xmlrpcをwordpressで使用して、特定のカスタムタイプ(コレクションと呼ばれる)の投稿を取得しようとしています。

WordpressAPIドキュメントには次のように記載されています。

wp.​​getPosts

Parameters:
int blog_id
string username
string password
struct filter: Optional.
   string post_type
   string post_status
   int number
   int offset
   string orderby
   string order
array fields: Optional.

私の問題は、objcで文字列を使用して構造体を形成することです。

私はこのようなことをしたいと思っています:

// in .h

typedef struct{
    string post_type;
    string post_status;
    int number;
    int offset;
    string orderby;
    string order;
} wp_filter;

// in .m

wp_filter filter = {@"collection", @"", ... , ... ,@"",@""};
NSArray *fieldsArray = [NSArray arrayWithObjects:@"post_title", nil];
NSArray *postParams = [NSArray arrayWithObjects:@"0", username, password, filter, fieldsArray, nil];
XMLRPCRequest *reqCollections =[[XMLRPCRequest alloc] initWithURL:[NSURL URLWithString:server]];

[reqCollections setMethod:@"wp.getPosts" withParameters:postParams];

XMLRPCResponse *customPostResponse = [XMLRPCConnection sendSynchronousXMLRPCRequest:reqCollections error:nil];

if ([[customPostResponse object] isKindOfClass:[NSArray class]]){
    NSArray *collections = [NSArray arrayWithArray:[customPostResponse object]];
    NSLog(@"number of collections %i",[collections count]);
    for (int i = 0; i < [collections count]; i++) {
        NSLog(@"%@", [[collections objectAtIndex:i] description] );
    }
}
else {
    NSLog(@"response description %@",[[customPostResponse object ] description]);
}
4

1 に答える 1

2

XML-RPC WordPress API については知りませんが、structsC コンストラクトは CocoaNSObjectsではないため、NSArray.

は構造体であるため、その[NSArray arrayWithObjects:..., filter, ..., nil]行は無効です。filterwp_filter

APIドキュメントに記載されている「構造体」は、データ構造/組織を説明するための擬似コードだと思います。明らかに、その概念を Cocoa オブジェクトに「変換」する必要があります。

C 構造体を に変換NSArrayし、API が期待するのと同じ順序でパラメーターを渡すか、構造体を に変換する可能性が高くなりますNSDictionary。そのキーは構造体フィールドの名前であり、値は明らかに構造体のフィールド値。

さらに、整数を Cocoa オブジェクトにカプセル化するにはNSNumber、整数を に変換する代わりに クラスを使用する必要がありますNSStrings


したがって、これは次のようなものを与える必要があります。

NSDictionary* filter = [NSDictionary dictionaryWithObjectsAndKeys:
    @"collection", @"post_type",
    @"", @"post_status",
    [NSNumber numberWithInt:number], @"number",
    [NSNumber numberWithInt:offset], @"offset",
    @"", @"orderby",
    @"", @"order",
    nil];
NSArray *postParams = [NSArray arrayWithObjects:
    [NSNumber numberWithInt:0], // blog_id
    username,
    password,
    filter,
    [NSArray arrayWithObject:@"post_title"], // fieldsArray
    nil];

または、Modern Objective-C を使用できる最近の LLVM コンパイラを使用する場合は、より簡潔な構文を使用できます。

NSDictionary* filter = @{
    @"post_type": @"collection",
    @"post_status": @"",
    @"number": @(number)
    @"offset": @(offset)
    @"orderby": @"",
    @"order": @""};
NSArray *postParams = @[ @0, username, password, filter, @[@"post_title"]];

たとえば、パラメーター"orderby"やパラメーターなど、呼び出しで設定したくないパラメーターについては、キーをスキップして辞書に設定することを避けることができます。"order"

繰り返しますが、私は Wordpress XML-RPC API を使用したことはありませんが、ドキュメントを理解しているので、これが機能しない場合、ソリューションは次のようなものにかなり近いはずです (たとえば、私が間違っている可能性があり、NSArray代わりに を使用する必要がある場合があります)。ドキュメントに記載されている「フィルター」疑似構造のNSDictionaryfor ;質問のドキュメントから引用したものは、Cocoaを介して使用するときにどれを使用する必要があるかを判断するには十分ではありません)。

于 2012-09-16T01:19:27.527 に答える