Querying Database with wpdb

时间:2016-07-11 作者:Phawkes

我试图通过functions.php. 我尝试了三种不同的方法来使用动态ID获得结果,但都没有成功。我总是得到NULL作为响应。这里不可能使用WP\\u查询,所以我需要使用SQL来解决这个问题。

Attempt #1:

global $post;
global $wpdb;
$post_ID = $post->ID;

$result = $wpdb->get_var($wpdb->prepare( 
"
    SELECT meta_value 
    FROM $wpdb->postmeta 
    WHERE post_id = %d
    AND meta_key = \'wpcf-release-date\' 
", 
$post_ID
) );

Attempt #2:

$result = $wpdb->get_var("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = \'wpcf-release-date\' AND post_id = $post_ID");
Attempt #3:

$result = $wpdb->get_var("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = \'wpcf-release-date\' AND post_id = " . $post_ID);
我知道我的查询工作正常,我在Phpmyadmin中使用静态ID测试了SQL查询。我还可以在函数中手动设置ID,这将产生一个结果,但如果不是动态的,则对我没有帮助。

SQL Query

SELECT  `meta_value` 
FROM  `wp_postmeta` 
WHERE post_id = 249
AND meta_key =  \'wpcf-release-date\'
我想我忽略了一些简单的事情。

2 个回复
最合适的回答,由SO网友:Phawkes 整理而成

结果证明我所有的尝试都是可行的(感谢ehsaan的确认)。问题是,我试图从函数执行时为空的字段中获取数据。(我正在创建一个新的/更新的帖子,但尚未更新该字段)。

Solution (delay the hook):

// Time out the custom field to update AFTER the post has been created/updated
function save_custom() {
    global $post;
    $post_ID = $post->ID;
    $result = get_post_meta( $post_ID, \'wpcf-release-date\', 1 );

    // Add a new key "era"
    add_post_meta($post_ID, "era", $result, true);
    // If there is already a key "era", then update it
    if ( ! add_post_meta($post_ID, "era", $result, true) ) { 
       update_post_meta( $post_ID, "era", $result );
    }
}
add_action(\'save_post\', \'save_custom\', 0);
add_action(\'save_post\', \'save_custom\', 10);
add_action(\'save_post\', \'save_custom\', 999);

SO网友:Ehsaan

我在一个短代码中测试了您的所有尝试:

function add_test_shortcode() {
  global $wpdb;
  global $post;
  $post_ID = $post->ID;
  $wpdb->show_errors = true;
  $result = $wpdb->get_var(\'SELECT meta_value FROM \'.$wpdb->postmeta.\' WHERE meta_key="my_test" AND post_id=\' . $post_ID);

  return $result;
}
add_shortcode( \'test\', \'add_test_shortcode\' );
它对我来说非常有效,所以您自己的代码中可能有一些东西:

1。检查$post\\u ID

确保$post_ID 是有效的,get_the_ID() 在很多情况下可能是比global $post;.

2。测试生成的查询

您可以使用$wpdb->last_query, 在phpMyAdmin或任何其他软件中执行它,并检查是否确实有结果。

3。查看是否有任何错误

您可以使用$wpdb->last_error.

在WordPress开发期间,我给你的建议是WP_DEBUG 在…上