使用Wordpress REST API使用自定义url / meta标签创建页面

时间:2018-07-22 20:38:25

标签: wordpress wordpress-rest-api

我正在尝试在我的域上创建一个自定义页面,该页面的URL为'http://example.com/test/slug',但是该Slug似乎不支持斜线(该Slug'/ test / slug'变成了'/ testslug ')。是否可以使用rest api在自定义网址上创建页面? 另外,我填充“ meta”字典,但是创建的页面的标题中不包含meta“ description”标记。如何正确创建自定义元标记?

import requests

url = 'http://example.com/wp-json/wp/v2/pages'
data = {'content': '<h2>test content</h2>',
 'meta': {'description': 'this is a test meta field'},
 'slug': 'test/slug',
 'status': 'publish',
 'title': 'test title'}

resp = requests.post(url, json=data, auth=('user','pass'), headers={'Content-Type':'application/json'})

3 个答案:

答案 0 :(得分:2)

  

该子弹似乎不支持斜线(该子弹'/ test / slug'变成   放入“ / testslug”)。

是的,因为无论您使用REST API还是使用管理界面来创建Pages,该信息段均限于字母数字字符,加上破折号(-)和下划线({{1 }})。参见https://developer.wordpress.org/rest-api/reference/pages/#schema-slug

可以可以通过在主题的_文件(或自定义插件)中添加remove_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10, 3 );来消除限制;但是,默认情况下,访问页面(URL)会引发404(未找到)错误。有多种方法可以解决此问题,但是总之,您不应该删除 filter

  

是否可以使用rest api在自定义网址上创建页面?

不是,不是默认情况。

但是,如果您希望functions.php投放/显示页面/帖子/等。无论是否通过REST API创建,那么您都可以使用自定义网址重写规则,例如通过http://example.com/test/slug

  

创建的页面在以下位置不包含元“描述”标记   标头。如何正确创建自定义元标记?

您需要注册元密钥,在您的情况下为add_rewrite_rule()

请参见

您可以使用wp-includes / meta.php中的register_meta()函数对其进行注册。

您的description元的示例:

description

要快速测试元<?php // The object type. For custom post types, this is 'post'; // for custom comment types, this is 'comment'. For user meta, // this is 'user'. $object_type = 'post'; // 'post' even for Pages $args1 = array( // Validate and sanitize the meta value. // Note: currently (4.7) one of 'string', 'boolean', 'integer', // 'number' must be used as 'type'. The default is 'string'. 'type' => 'string', // Shown in the schema for the meta key. 'description' => 'A meta key associated with a string meta value.', // Return a single value of the type. 'single' => true, // Show in the WP REST API response. Default: false. 'show_in_rest' => true, ); register_meta( $object_type, 'description', $args1 ); 是否已成功注册以及是否可以从REST API获得,请对description执行GET请求,其中http://example.com/wp-json/wp/v2/pages/<id>是页面ID。

答案 1 :(得分:2)

首先,请确保您的永久链接设置为“帖子名称”。

可以在http://<yoursite.com>/wp-admin/options-permalink.php

下进行配置

我研究了“自定义永久链接”插件代码,以了解如何回答此问题,它保存了名为“ custom_permalink”的元数据,并进行了大量的INNER JOINS处理,以使WordPress核心可与“假”子子弹一起使用。

我想出了一个不同的解决方案。这里的技巧是创建一个伪造的父页面作为子页面的基本URL。我用PHP编写了它,因为我不了解Python。

<?php

require_once('helpers.php');

define('API_URL', 'http://temp.localhost');

# Let's get all pages in an array
$pages = curlGet(API_URL.'/wp-json/wp/v2/pages');

# Your usual $args
$args = array(
    'title' => 'API TEST',
    'status' => 'draft',
    'content' => 'content',
    'slug' => 'some/thing'
);

# We intercept it here, before sending to WordPress
$args = maybe_add_parent($args);

$response = curlPost( API_URL.'/wp-json/wp/v2/pages/', $args );

/**
*   Receives an $args array that would be sent to WordPress API and checks if we need to add a parent page
*/
function maybe_add_parent(array $args) {
    if (array_key_exists('slug', $args)) {
        # Has parent?
        if (strpos($args['slug'], '/') !== false) {
            $parent = explode('/', $args['slug']);
            # For simplicity sake let's do it parent/chidren slugs only
            if (count($parent) !== 2) {
                die('This script can only run parent/children slugs');
            }
            $slug = array_pop($parent);

            # Here, we will check the parent to see if it exists.
            $parent_id = slug_exists($parent[0]);
            if ($parent_id === false) {
                # If it does not, it will create it and return it's ID
                $parent_id = create_parent($parent[0]);
            }
            # Add parent ID to $args.
            $args['parent'] = $parent_id;
            # Rename the slug
            $args['slug'] = $slug;
        }
    }
    return $args;
}

/**
*   Checks if a given slug exists in $pages
*/
function slug_exists(string $slug) {
    global $pages;
    foreach ($pages as $page) {
        # Checks if a "Parent" page with this slug exists
        if ($page['slug'] == $slug && $page['parent'] == 0) {
            return true;
        }
    }
    return false;
}

/**
*   Creates a parent page
*/
function create_parent(string $slug) {
    $args = array(
        'title' => $slug,
        'status' => 'draft',
        'content' => '',
        'slug' => $slug
    );
    $response = json_decode(curlPost( API_URL.'/wp-json/wp/v2/pages/', $args ));
    return $response->id;
}

脚本执行以下操作:

  • 针对网站上的所有页面发送GET请求。
  • 拦截将发送到WordPress API的$ args数组。
  • 检查此$ args是否包含格式为parent/child的子段
  • 如果存在,请检查parent页面是否存在
  • 如果没有,它将创建此页面作为草稿并返回其ID。
  • 父级已经存在,它将返回其ID
  • 使用上级ID,它将通过添加parent键来修改$ args并返回$ args
  • 当WordPress看到该页面有一个父页面时,它将自动在url中添加该页面,如parent/child

有效:

slug api wordpress create page

答案 2 :(得分:1)

要获得所需的URL结构,最直接的方法是创建一个子页面,该子页面引用一个已经存在的页面作为其父页面。

要修改上面的示例:

import requests

url = 'http://example.com/wp-json/wp/v2/pages'
parent_page = 43 # assuming that page with URL '/test' has id of 42
data = {'content': '<h2>test content</h2>',
 'meta': {'description': 'this is a test meta field'},
 'slug': 'slug',
 'status': 'publish',
 'title': 'test title'
 'parent': parent_page} # <--

resp = requests.post(url, json=data, auth=('user','pass'), headers={'Content-Type':'application/json'})

将在example.com/test/slug上给您一个新页面

参考WordPress rest API手册上的“创建页面”(POST /wp/v2/pages)的参数:https://developer.wordpress.org/rest-api/reference/pages/#create-a-page