在 Wordpress 中发布帖子并根据自定义字段元填充字段时运行 SQL 函数
Posted
技术标签:
【中文标题】在 Wordpress 中发布帖子并根据自定义字段元填充字段时运行 SQL 函数【英文标题】:Run a SQL function when Publishing a post in Wordpress and populate fields according to Custom field meta 【发布时间】:2012-09-09 02:58:25 【问题描述】:我想在发布帖子时运行 sql 查询。我只是不确定如何将它包装在一个函数中,以及在哪里粘贴该函数以在我单击发布时生效。 以下命令是我需要的,它在 phpMyAdmin-SQL 中成功运行,并且在我的 wordpress 后端也正确反映。
INSERT INTO `databasename`.`wp_xxxxxx` (
`id` ,
`name` ,
`item_number` ,
`price` ,
`options_2`) VALUES (
'9', 'xxxx1', 'xxxx2', 'xxxxx3', 'xxxx4'
);
但是,当我每次保存帖子时,如何在我的 functions.php 文件中让它在 PHP 中运行? 我尝试了以下方法,但我确信它是正确的,因为我之后进行了刷新并且没有创建表:
function do_my_stuff($post_ID)
mysql_query("INSERT INTO `databasename`.`wp_xxxxx` (
`id` ,
`name` ,
`item_number` ,
`price` ,
`options_2`) VALUES (
'9', 'xxxx1', 'xxxx2', 'xxxx3', 'xxxxx4'");
return $post_ID;
add_action('save_post', 'do_my_stuff');
发布帖子时。它实际上是一个需要一些细节的产品。
这是我想要填充的 sql 查询的值。
id = 帖子的 postID 号。 name = 帖子标题item_number = 它应该是一个自定义字段发布元值,即将到来 从一个名为“代码”的字段中,目前我通过以下方式在我的单页模板上回显它:
ID,'代码',真))回声 do_shortcode(get_post_meta($post->ID, 'scode', $single = true)); ?>price = 价格,我也通过自定义字段手动输入 称为“价格”,我目前通过以下方式回应:
options_2,我也通过自定义字段值手动输入 称为“变体”。
这一切都可以这样吗?
可能是这样的:
INSERT INTO `databasename`.`wp_cart66_products` (
`id` ,
`name` ,
`item_number` ,
`price` ,
`options_2`) VALUES (
'9', '<?php the_title(); ?>', '<?php if ( get_post_meta($post->ID, 'scode', true) ) echo do_shortcode(get_post_meta($post->ID, 'scode', $single = true)); ?>', '<?php $values = get_post_custom_values("price"); echo $values[0]; ?> ', '<?php $values = get_post_custom_values("variations"); echo $values[0]; ?> '
);
请注意,我不太了解 php 或 SQL。我花了几个小时试图找到尽可能多的信息来提供可靠的请求。
【问题讨论】:
作为 WP 的新手,相当努力。请记住阅读手册并学习 WP 特定的数据库查询和面向对象的方法。问候。 【参考方案1】:您已经很接近了,当您将帖子执行保存到 add_action
引用时,您定义的函数正在运行,但 do_my_stuff()
的内容并不完全正确。
推荐使用$wpdb
全局变量访问数据库,甚至引用表。例如,如果您使用wp_
的默认前缀,您可能希望对wp_users
表使用$wpdb->users
。如果不是标准表但仍然使用前缀,比如插件,可以使用$wpdb->prefixtablename
。您还应该使用$wpdb->prepare
来帮助确保您生成有效的 SQL(以及防止 SQL 注入)。
试试这个:
function do_my_stuff($post_ID)
global $wpdb; // the wordpress database object
// check if this is a revision, if so use the parent post_id
if ($parent_id = wp_is_post_revision( $post_id )) $post_ID = $parent_id;
// load the post
$post = get_post($post_ID);
// load postmeta values
$scode = get_post_meta($post_ID, 'scode', true);
$price = get_post_meta($post_ID, 'price', true);
$variations = get_post_meta($post_ID, 'variations', true);
// create sql, use %d for digits, %s for strings
$sql = $wpdb->prepare("INSERT INTO $wpdb->prefixxxxxx (id, name, item_number, price, options_2) VALUES (%d, %s, %s, %s)", $post_ID, $post->post_name, $scode, $price, $variations);
// run the query
$wpdb->query($sql);
// add custom function to run on post save
add_action('save_post', 'do_my_stuff');
【讨论】:
您的代码看起来更安全/可靠。当我在 xxxxx 添加表并发布/更新帖子时,它不会反映在数据库中。我有一个似乎可以做到这一点的类似代码,但我不确定它是否像你的那样以友好安全的方式编写。你能快速看一下吗?我将其粘贴在上面作为答案 关于您的代码的一些注释(不能在您的答案中添加评论): 1:您不想在全局行中包含$post
- 编辑后的帖子可能会有所不同。我建议从$post=get_post($post_ID)
访问它。我还建议使用if ($parent_id = wp_is_post_revision( $post_id )) $post_ID = $parent_id;
,因为“当前”帖子可能是修订版 2:我将定义 $tablename="$wpdb->prefixcart66_products";
,以防前缀更改 3:对于 get_post_meta(),尝试 $value!==false
当所有其他方法都失败时,添加一些 @ 987654335@ 条目以查看正在执行的内容。
非常值得称赞的答案,有帮助的专业提示 $wpdb->users
和 $wpdb->prefixtablename
。【参考方案2】:
function do_my_stuff($post_ID)
global $post,$wpdb;
$tablename="wp_cart66_products";
if($post->post_type == "post" && strlen( get_post_meta($post_ID, 'price', true))>0 )
$id = $wpdb->get_var("SELECT id FROM ".$tablename." WHERE id=".$post_ID);
$data=array(
'id'=>$post_ID,
'item_number'=>get_post_meta($post->ID, 'scode', true),
'name'=>$post->post_title,
'price'=>get_post_meta($post->ID, 'price', true),
'options_2'=>get_post_meta($post->ID, 'variations', true)
);
$where = array("id" => $post_ID);
// Possible format values: %s as string; %d as decimal number; and %f as float.
$format=array( '%d', '%s', '%s', '%s', '%s');
$where_format = array( '%d' );
if($id>0)
// update
$wpdb->update( $tablename,$data, $where, $format, $where_format);
else
// insert
$wpdb->insert( $tablename,$data,$format);
return $post_ID;
add_action('publish_post', 'do_my_stuff');
【讨论】:
以上是关于在 Wordpress 中发布帖子并根据自定义字段元填充字段时运行 SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress:使用 wp_insert_post() 填充自定义帖子类型字段