获取meta_id以及meta_key和meta_value

时间:2013-08-19 作者:ragulka

有没有可能get_post_metaget_post_custom 并将meta\\u id与meta_value? 例如:

$data = get_post_meta( $post_id, \'my_key\' );
// returns this:
array( 0 => array(\'myvalue1\', 1002 ), 1 => array( \'myvalue2\', 1003 ));
基本思想是,因为同一个可能有多个meta\\u值meta_key, 我必须知道meta_id 为了可靠地更新/删除post meta。

5 个回复
SO网友:harmputman

此功能对我有效:

function get_complete_meta( $post_id, $meta_key ) {
  global $wpdb;
  $mid = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, $meta_key) );
  if( $mid != \'\' )
    return $mid;

  return false;
}
它将返回一个对象数组,如:

Array
(
    [0] => stdClass Object
        (
            [meta_id] => 1002
            [post_id] => 1
            [meta_key] => my_key
            [meta_value] => my_value
        )
    [1] => stdClass Object
        (
            [meta_id] => 1003
            [post_id] => 668
            [meta_key] => my_key
            [meta_value] => another value
        )
)

SO网友:s_ha_dum

我不知道有什么核心函数/方法可以用键检索post meta。这并不是说肯定没有。可能有。我不知道WordPress的一切,我只是假装:)或者我现在刚刚忘记了它。

但是,的第四个参数update_post_meta 是为了确保仅在存在多个键的情况下更新要更新的值。

$prev\\u value(混合)(可选)要更改的自定义字段的旧值。这是为了区分具有相同键的多个字段。如果省略,并且此post和meta键有多行,则将更新所有meta值。

在第四个参数中发送之前保存的值,然后仅更新该条目。

delete_post_meta 操作类似,但使用第三个参数而不是第四个参数。

SO网友:Anjum

在函数中添加此代码。php

function get_mid_by_key( $post_id, $meta_key ) {
    global $wpdb;
    $mid = $wpdb->get_var( $wpdb->prepare("SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s", $post_id, $meta_key) );
    if( $mid != \'\' )
    return (int) $mid;

    return false;
}
然后打电话到你想去的地方

$meta_id = get_mid_by_key( your_post_id, \'your_meta_key\' );

SO网友:Stephen M. Harris

奇怪的是,自v3以来,Wordpress提供了通过meta\\u id获取、更新和删除meta的功能。3,但从v3开始。7没有任何返回meta id的函数。因此,使用meta的核心函数。php作为参考,我实现了以下函数,以便能够检索元ID和值。

解决方案

使用下面的自定义功能get_post_meta_db() 要获取元键ID和值,请使用Wordpress\'update_meta()delete_meta() 操纵post meta。

例如:

$meta = get_post_meta_db( $post_id, \'my_key\', true ); // Returns array( 
//   \'post_id\' => 5, 
//   \'meta_id\' = 33, 
//   \'meta_key\' => \'my_key\', 
//   \'meta_value\' => \'the_value_for_my_key\' );
update_meta( $meta[\'meta_id\'], $meta[\'meta_key\'], \'new_value\' );
以下是自定义函数定义:

/**
 * Alternative to get_post_meta(), to retrieve meta_ids. @see get_meta_db()
 */
function get_post_meta_db( $post_id, $meta_key = null, $single = false, $meta_val = null, $output = OBJECT ){
    return get_meta_db( \'post\', $post_id, $meta_key, $meta_val, $single, $output );
}

/**
 * Alternative to get_metadata(). Differences:
 *  - returns every meta field (instead of only meta_values)
 *  - bypasses meta filters/actions
 *  - queries database, bypassing cache
 *  - returns raw meta_values (instead of unserializing arrays)
 *
 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)
 * @param int    $object_id ID of the object metadata is for
 * @param string $meta_key  Optional. Metadata key to retrieve. By default, returns all metadata for specified object.
 * @param mixed  $meta_val  Optional. If specified, will only return rows with this meta_value.
 * @param bool   $single    Optional. If true, returns single row, else returns array of rows.
 * @param string $output    Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants. @see wpdb::get_results()
 *
 * @return array Single metadata row, array of rows, empty array if no matches, or false if there was an error.
 */
function get_meta_db( $meta_type, $object_id = null, $meta_key = null, $meta_val = null, $single = false, $output = OBJECT ){

    if( !$meta_type || !$table = _get_meta_table( $meta_type ) ) 
        return false;

    // Build query
    global $wpdb;
    $query = $wpdb->prepare( "SELECT * FROM $table", $object_id );
    // Add passed conditions to query
    $where = array();
    if( $object_id = absint( $object_id ) )
        $where[] = $wpdb->prepare( sanitize_key( $meta_type.\'_id\' ).\' = %d\', $object_id );
    if( !empty($meta_key) )
        $where[] = $wpdb->prepare( \'meta_key = %s\', wp_unslash( $meta_key ) );
    if( null !== $meta_val )
        $where[] = $wpdb->prepare( \'meta_value = %s\', maybe_serialize(wp_unslash($meta_val)));
    if( !empty($where) )
        $query .= \' WHERE \'.implode(\' AND \', $where );
    if( $single )
        $query .= \' LIMIT 1\';

    $rows = $wpdb->get_results( $query, $output );

    if( empty( $rows ) )
        return ( $single ? null : array() );

    /* 
    Uncomment this section to have this function unserialize values (like get_metadata())
    NOTE: This can be implemented more efficiently using array_map
    // Unserialize serialized meta_values
    foreach( $rows as &$r ){
        $v =& ($output==ARRAY_A ? $r[\'meta_value\'] : $output==ARRAY_N ? $r[3] : $r->meta_value );
        $v = maybe_unserialize( $v );
    } */

    return ( $single ? reset( $rows ) : $rows );
}
注意:这些函数查询数据库,所以请谨慎使用get_metadata_by_mid(), 通过不使用"get_post_metadata"/"get_user_metadata" 预筛选,不更新缓存get_metadata_by_mid(), 此实现不会取消元值的序列化

SO网友:hakre

基本思想是,因为同一个可能有多个meta\\u值meta_key, 我必须知道meta_id 为了可靠地更新/删除post meta。

你所说的meta_id 这里技术上不存在于Wordpress中。这里有post_id 这也是所有meta的id(在meta sprak中,这是object_id).

旁边是meta_key 正如您正确地写的那样,每个meta_key 在同一时间object_id, 存在歧义,因为所有这些都取决于数据库在此处显示值的顺序,而这只是间接的,因为元数据也有其缓存,即对象缓存。

所以即使你能看到meta_id 在数据库中,它不仅仅用于在数据库中有主键。

它不是Wordpress PHP用户代码中使用的数据库结果的一部分,因此它不是元缓存的一部分,因此永远不会进入元API函数(因为它们通过元缓存API访问数据库)。

最终得出结论:

正如你所说meta_id 它只存在于数据库中(dbprefix_postmeta 表),您的问题只能表示删除/更新该表中的条目。只要正常的SQL操作就足够了。

结束

相关推荐

就多站点的wp-config.php if语句征求您的意见

我正在尝试将if语句写入wp config。php仅启用define(\'WP\\u DEBUG\',true);如果它不是WordPress多站点安装中的主站点。我只是不知道我可以从配置文件中调用多少WordPress codex函数。正在思考if ( is_main_site($blog_id) ) { define(\'WP_DEBUG\', false); } else { define(\'WP_DEBUG\', true); } 但我想我