【问题标题】:Database Query not working, Wordpress数据库查询不起作用,Wordpress
【发布时间】:2015-11-15 15:15:52
【问题描述】:

我一直在关注 Steve Marks 的教程,该教程将帖子中的信息添加到新的 Database Table 以及通常的 postmeta 中。但是无论我尝试什么,它都不会将信息存储在新表中,任何人都可以看到我哪里出错了吗?

教程可在此处获得:http://biostall.com/performing-a-radial-search-with-wp_query-in-wordpress 我的帖子类型是festival-event,并且我将自定义帖子类型的名称与函数中的名称相同,以查看我是否在那里遗漏了什么。

我用来在数据库中创建表的SQL是:

CREATE TABLE IF NOT EXISTS `lat_lng_post` (  
  `post_id` bigint(20) unsigned NOT NULL,  
  `lat` float NOT NULL,  
  `lng` float NOT NULL  
) ENGINE=InnoDB;  

而我functions.php文件中的函数是:

function save_lat_lng( $post_id )   
{  
    global $wpdb;  

    // Check that we are editing the right post type  
    if ( 'location' != $_POST['festival-event'] )   
    {  
        return;  
    }  

    // Check if we have a lat/lng stored for this property already  
    $check_link = $wpdb->get_row("SELECT * FROM lat_lng_post WHERE post_id = '" . $post_id . "'");  
    if ($check_link != null)   
    {  
        // We already have a lat lng for this post. Update row  
        $wpdb->update(   
        'lat_lng_post',   
        array(   
            "lat" => $_POST['lat_field_name'],  
            "lng" => $_POST['lng_field_name']  
        ),   
        array( "post_id" => $post_id ),   
        array(   
            "%f",  
            "%f"  
        )  
        );  
    }  
    else  
    {  
        // We do not already have a lat lng for this post. Insert row  
        $wpdb->insert(   
        "lat_lng_post",   
        array(   
            "post_id" => $post_id,  
            "lat" => $_POST['lat_field_name'],  
            "lng" => $_POST['lng_field_name']  
        ),   
        array(   
            "%d",   
            "%f",  
            "%f"  
        )   
        );  
    }  

}  
add_action( 'save_post', 'save_lat_lng' );

我一直在研究问题可能是什么,但没有任何运气,我真的被困住了。附件是 PHPMyAdmin 的图片,所以你可以看到 db

【问题讨论】:

  • 你的帖子到达了吗,通过 isset 的测试?
  • 我该如何测试呢?我的数据库知识很少,这是我唯一需要做的事情,帖子正常添加到 postmeta 表中

标签: php mysql database wordpress


【解决方案1】:

如果没有看到您正在遵循的教程,很难说出问题所在。然而,这个块让我觉得检查帖子类型的方式很奇怪:

if ( 'location' != $_POST['festival-event'] )   
{  
    return;  
}  

尝试将该块更改为以下内容:

if ( get_post_type( $post_id ) != 'festival-event'] )   
{  
    return;  
}  

或者,如果您使用的是 WordPress 3.7 或更高版本,您可以完全删除该块并连接到 save_post_festival-event。在那种情况下,你的最后一行看起来像

add_action('save_post_festival-event', 'save_lat_lng')

编辑:使用 ACF 进行这项工作

function save_lat_lng( $post_id )   
{  


    // Check that we are editing the right post type  
    if ( get_post_type($post_id) != 'festival-event' || empty($_POST['acf'] ))   
    {  
        return;  
    }  

    global $wpdb; 
    $fields = $_POST['acf'];

    // Check if we have a lat/lng stored for this property already  
    $check_link = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM lat_lng_post WHERE post_id = %d", $post_id
    ));  
    if (!empty($check_link))
    {  
        // We already have a lat lng for this post. Update row  
        $wpdb->update(   
            'lat_lng_post',   
            array(   
                "lat" => $fields['lat_field_name'],  
                "lng" => $fields['lng_field_name']  
            ),   
            array( "post_id" => $post_id ),   
            array(   
                "%f",  
                "%f"  
            )  
        );  
    }  
    else  
    {  
        // We do not already have a lat lng for this post. Insert row  
        $wpdb->insert(   
            "lat_lng_post",   
            array(   
                "post_id" => $post_id,  
                "lat" => $field['lat_field_name'],  
                "lng" => $field['lng_field_name']  
            ),   
            array(   
                "%d",   
                "%f",  
                "%f"  
            )   
        );  
    }  
}  
add_action( 'acf/save_post', 'save_lat_lng', 1 );

*注意,您必须将 lat_field_namelng_field_name 更改为您通过 ACF 创建字段时设置的任何值。

我还更改了您的查询以使用$wpdb->prepare

虽然与此问题无关,但我建议不要创建没有 wordpress 前缀的自定义表,在您的情况下为 wp_

【讨论】:

  • 不幸的是,这没有用,但这是 tut:biostall.com/…
  • 您是如何创建自定义字段的?它们是否成功存储在 postmeta 中?
  • 我用插件创建了它们,高级自定义字段但是是的
  • 这就解释了,当您使用 ACF 创建字段时,您需要使用它们的钩子(不是默认的 wordpress 钩子)。我现在正在更新我的答案。
  • 我确实尝试过,但我可能做错了,所以谢谢
【解决方案2】:

虽然@GentlemanMax 的回答比较有用,但实际的错误是菜鸟错误,我自己在另一个网站上解决了,答案是这样的

if ( 'festival-event' != $_POST['post_type'] )

而不是这个

if ( 'post_type' != $_POST['festival-event'] )

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多