如何在WordPress中从插件php编辑mySQL wp_posts表?

时间:2017-03-03 18:51:28

标签: php mysql wordpress plugins

我需要更改为wp_posts表创建/编辑条目的插件。目前,它缺乏针对某些特定领域的缺点。我正在努力编辑插件,以便我可以使用插件更改这些字段。具体如下。

我通常如何定位此表然后创建/编辑条目?

我想到的是这样的东西,它是从here。:

复制的
$my_post = array(
   'post_title'    => '#Enter the title#',
   'post_content'  => '#Enter the Content#',
   'post_status'   => 'publish',
   'post_author'   => 1
);

wp_insert_post( $my_post );

我认为这是可能的,因为我希望更改的插件已经对wp_posts表进行了更改。我该怎么做呢?我有C#的编程经验,但我的PHP和WP知识严重缺乏。我假设有一些WordPress key functions我正在寻找,但我根本不知道它们是什么或如何找到它们(我可能正在寻找错误的术语)。 wp_insert_post()看起来非常有前途,但the documentation似乎意味着它不能满足我的特定需求。

具体细节信息

我正在使用名为Really Simple CSV importer(RSC)的精彩插件,它允许您使用csv创建/更新帖子。它似乎能够定位几乎每个字段(例如post_titlepost_idpost_parentpost_content_wp_page_template等。如果你必须定期创建数百页(我这样做),这是非常有用的。

问题在于它不会定位两个特定字段,标题为group_accesstag_list。我将这些字段作为列放在我的csv中,但它们没有添加到mySQL数据库中,因此不会在网站上更改。我相信这些字段特定于名为iMember360的插件,该插件是一个与InfusionSoft帐户绑定的插件。

当然,我已经尝试过联系RSC支持,但根本没有收到任何回复。我已经对iMember360支持进行了长时间的支持,他们在没有自己完成工作的情况下给予我最好的就是他们使用动作挂钩import_end来对表进行更改,所以如果RSC不使用它那么它不会影响那些领域。他们还说iMember360具有导入/导出功能,但它仅适用于插件的特定功能,并且与WordPress XML导入/导出功能相关联。很明显,这个RSC插件不会这样做。

无论这些限制如何,在我看来,如果该字段存在于表中,那么您应该能够对其进行编辑,因此我倾向于认为RSC插件缺少此功能,可能仅针对WP仅限默认字段。

我尝试过的事情:

我已经尝试直接编辑插件PHP,假设该插件根本没有group_accesstag_list字段的条目。

包含的一个PHP文件:

// (string, comma separated) name of post tags
$post_tags = $h->get_data($this,$data,'post_tags');
if ($post_tags) {
    $post['post_tags'] = $post_tags;
}

我只需将其复制并粘贴在其​​正上方,然后将post_tags更改为group_access。它没有用。

我也找到了,并添加到:

$attachment = array(
            'post_mime_type' => $mime_type ,
            'post_parent'    => $this->postid ,
            'post_author'    => $this->post->post_author ,
            'post_title'     => $title ,
            'post_content'   => $content ,
            'post_excerpt'   => $excerpt ,
            'post_status'    => 'inherit',
            'menu_order'     => $this->media_count + 1,
////////// added
            'group_access'   => $group_access ,
            'tag_list'   => $tag_list ,
//////
        );

那也没有做任何事情。

1 个答案:

答案 0 :(得分:0)

有两种方法可以编辑我所知道的wp_posts表。第一个是wp_update_post()wp_insert_post()函数。这些是与任何其他功能一样使用的典型WP功能。您只需传递正确的参数即可。例如:

$my_post = array(
      'ID'           => $updatePostID, // User defined variable; the post id you want to update.
      'post_title'   => 'Update Title',
      'post_content' => 'Update Content', 
  );
// Update the post into the database
$post_id = wp_update_post( $my_post, true ); // Returns 0 if no error; returns post id if there was an error.

// Check if table was updated without error. For debugging. Remove from your code if it all works, before publishing.
if (is_wp_error($post_id)) {
    $errors = $post_id->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
}

只需将带有预定义字段名称的数组传递给函数,然后它们就会正确运行。更新函数自然地用于更新,并且insert函数创建新的表条目(行)。但是,有一个限制。这两个函数仅在WP预定义字段上运行。因此,如果您的表包含一些自定义字段,则必须使用$wpdb类。

从WordPress更新mySQL表的另一种方法是直接使用$wpdb类。这个类比wp_update_post()wp_insert_post()函数更具扩展性。第一个区别是它可以编辑许多其他mySQL表,而不仅仅是wp_posts表。它还可以编辑非WP字段。例如:

global $wpdb; // This calls the use of the class. I actually do not think this is necessary, but I do it anyway.
$dbresult = $wpdb->update($wpdb->posts, // Returns 0 if no errors. Post ID if errors occurred. 
            // Notice posts instead of wp-posts. Prefixes are not necessary with this class.
     ['post_title' => 'Update Title', 
      'post_content' => 'Update Content', 
      'custom_field' => $customField, ], // User defined table column and variable.
     ['ID' => $updatePostID, ]); // User defined variable; the post id.
if (false === $dbresult) {
    echo 'An error occurred while updating...'; 
    $errors = $post_id->get_error_messages();
}

我对这些选项中的任何一个都不是很熟悉,但是功能的宽度似乎有很大差异,因此在使用其中一个之前可能需要考虑。我为此提出了一个问题:https://wordpress.stackexchange.com/q/259043/38365一个reply说:

  

$wpdb的缺点是您确实需要了解SQL,并且需要注意正常的数据清理以及何时使用prepare()以及哪些函数已经准备好您的语句几乎不会有任何缺点。 $wpdb类本质上比任何默认的WordPress函数更强大,因为可以访问所有数据,自定义与否,假设您知道正确的SQL来获取,修改或删除它。

     

TL; DR $wpdb功能更强大但不那么友好和宽容。

这对我有意义。基本上,除非你知道自己在做什么或绝对必须,否则不要使用$ wpdb。