如何通过插件更新推送WordPress发布内容?

时间:2016-09-29 14:33:50

标签: php mysql wordpress

我们有一个内部WordPress插件,可以使用自定义后期类型创建内容。从本质上讲,所创建的内容,无论出于何种意图和目的,都与WordPress' Pages'相同。

我们的想法是,我们会添加这些自定义页面' - 通过我们的插件 - 然后为使用该插件的任何人部署/更新它们。我们使用我们的插件创建了一系列这些页面,但问题是如何使用插件移植此自定义内容。

最初我们认为既然我们的帖子有自定义的帖子类型,我们就可以在数据库中轻松识别它们。实际上,我们在卸载插件时使用它来删除我们的自定义内容。

但是我们如何反过来呢?理想情况下,我们想要更新插件,以及我们添加或修改的任何自定义内容。

最初我们只考虑使用MySQL脚本来添加这个自定义帖子内容,但经过一些研究后,这似乎并不是正确的方法。

我知道WordPress有一个wp_insert_post()函数,但我不确定它们是如何组合在一起的。

理想情况下,答案是概述更新自定义内容的过程。例如,我们的插件中是否应该有一个函数在安装时查找sql​​文件并从中创建新帖子?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确并且您尝试通过插件更新在多个安装中保持内容同步,则需要为所有内容创建唯一ID。以编程方式执行更新时,您将通过帖子ID进行更新,但每个安装都将具有不同的帖子ID。您可以使用帖子元字段为每个帖子提供特定于您的插件的唯一ID。然后,您可以根据您的唯一元字段查询帖子。

我会对插件进行编码,以便检查是否有包含您唯一ID的帖子。如果找不到,则插入新帖子。如果找到,则更新帖子。

假设您已经创建了第一段内容,并且它的唯一ID将是jgohil_1。您的插件可能会使用以下内容来检查该唯一ID,然后根据其是否存在进行更新或插入。

<?php

// our meta key/value pair for our unique id
$meta_key = 'jgohil_unique_id';
$meta_value = 'jgohil_1';

// set our new content
$new_content = 'The new content here';
$new_title = 'The new title here';

// check the database to see if we have created the post already by querying for our unique id
global $wpdb;

$sql = $wpdb->prepare (
    "SELECT post_id 
    FROM $wpdb->postmeta 
    WHERE meta_key = %s 
    AND meta_value = %s",
    $meta_key,
    $meta_value
);

$post_id = $wpdb->get_var( $sql );

// if we got a post id then update else insert
if ( $post_id ) {

    // set up the data for updating
    $data = array(
        'ID' => $post_id,
        'post_content' => $new_content,
        'post_title' => $new_title,
    );

    // update the post
    $updated = wp_update_post( $data );

    if ( is_wp_error( $updated ) ) {
        // do some error handling here
    }

} else {
    $data = array(
        'post_title' => $new_title,
        'post_content' => $new_content
        'post_type' => 'your_custom_post_type'
    );

    $post_id = wp_insert_post( $data );

    // if the insert worked give the post the unique meta id
    if ( ! is_wp_error( $post_id ) && $post_id !== 0 ) {
        update_post_meta( $post_id, $meta_key, $meta_value );
    } else {
        // do some error handling here
    }
}

如果您需要同时处理多个内容,您可能希望使用循环并每次更改元值。