使用wp_insert_post()创建页面

时间:2016-11-24 12:29:40

标签: wordpress

我有一个表单,用于收集有关用户产品的数据,然后使用

在WordPress中创建一个页面
$my_post = array(
            'post_content'   => "My page content",
            'post_title'     => $product_title,
            'post_name'      => $product_title,
            'post_type'      => 'page',  // must be 'page'  to accept the 'page_template' below
            'page_template'  => "listing.php",
            'post_status'    => "publish"
        );
        $ID = wp_insert_post( $my_post );
        $permalink = get_permalink($ID);
        echo "<br />ID for new page is $ID, Permalink for new page is $permalink";

表单数据放入页面ID的元变量中,listing.php模板文件将其拉出并构建HTML以显示产品页面。这一切都很好,我可以看到页面元变量_wp_page_template被正确设置到我指定的模板文件,listing.php:

enter image description here

现在我想从相同的表单数据创建第二个页面,这个页面以不同的方式显示数据的不同部分。所以我添加了第二个代码块,从下面的$ my_cert开始,它创建了第二个页面并指定了另一个模板certificate.php,它知道如何构建第二个版本的数据。

$my_post = array(
            'post_content'   => "My page content",
            'post_title'     => $product_title,
            'post_name'      => $product_title,
            'post_type'      => 'page',  // must be 'page'  to accept the 'page_template' below
            'page_template'  => "listing.php",
            'post_status'    => "publish"
        );
        $ID = wp_insert_post( $my_post );
        $permalink = get_permalink($ID);
        echo "<br />ID for new page is $ID, Permalink for new page is $permalink";

    $my_cert = array(
      'post_content'   => "My certificate",  // post_content is required
      'post_title'     => "My certificate",  // post_title is required
      'post_name'        => "My certificate",
      'post_type'      => 'page',  // must be 'page'  to accept the 'page_template' below
      'page_template'  => "certificate.php",
      'post_status'    => "publish"
    );
    $CERT_ID = wp_insert_post( $my_cert );
    $cert_permalink = get_permalink($CERT_ID);
    echo "<br />ID for new certificate is $CERT_ID, Permalink for new certificate is $cert_permalink";

但是当我查看创建的第二个页面的元数据时,模板设置为“default”而不是certificate.php:

enter image description here

我知道我已将certificate.php正确设置为模板(在顶部设置/ *模板名称:证书* /),因为页面编辑模板下拉列表包含证书:

enter image description here

所以有人看到为什么我不能创建第二页,模板设置为certificate.php?

由于

1 个答案:

答案 0 :(得分:1)

您确定您的页面模板src:certificate.php是:certificate.php吗?而不是:templates/certificate.php或类似的东西。查看主题文件夹,并将其作为页面模板路径的100%。检查拼写或页面模板路径或名称中的拼写错误。它必须完全匹配。

如果您仍有问题,我会查看并调试以下源代码:wp_insert_post()

if ( ! empty( $postarr['page_template'] ) && 'page' == $data['post_type'] ) {
    $post->page_template = $postarr['page_template'];
    $page_templates = wp_get_theme()->get_page_templates( $post );
    if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {
        if ( $wp_error ) {
            return new WP_Error('invalid_page_template', __('The page template is invalid.'));
        }
        update_post_meta( $post_ID, '_wp_page_template', 'default' );
    } else {
        update_post_meta( $post_ID, '_wp_page_template', $postarr['page_template'] );
    }
}

所以可能这部分失败了:

if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) )

尝试修改:wp-includes/post.php并转到行{28}的定义:function wp_insert_post()。并在行上添加一行:3312以进行调试。

    echo '<pre>';
    print_r( $page_templates );
    echo '</pre>';
    die();

确保您的certificate.php属于该阵列中的decimal(18,6)。请记住在继续之前删除调试代码。这应该给你一些答案。