获取元价值和关联的用户元

时间:2014-04-12 作者:TietjeDK

我在一个网站上工作,在那里用户可以发布带有自定义字段的帖子。我想显示所有帖子的元值,并包括哪个用户创建的帖子的元值来自哪里。

到目前为止,我已经能够显示所有帖子中的所有元值。我的代码:

function get_meta_values( $key = \'\', $type = \'workout\', $status = \'publish\' ) {
    global $wpdb;

    if ( empty( $key ) )
        return;

    $r = $wpdb->get_col(
        $wpdb->prepare( "
            SELECT pm.meta_value FROM {$wpdb->postmeta} pm
            LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
            WHERE pm.meta_key = \'%s\' 
            AND p.post_status = \'%s\' 
            AND p.post_type = \'%s\'",
            $key,
            $status,
            $type
        )
    );

    return $r;
}

$workout_leader= get_meta_values( \'1_rep\', \'workout\' );
foreach ( $workout_leader as $value ) { 
    echo $value; 
}
我如何为每个元值检索用户元(例如用户名)?

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

只需更改数据库查询以获取用户ID,然后返回一个数据对象数组(而不仅仅是元值):

function get_meta_values( $key, $type = \'workout\', $status = \'publish\' ) {
    global $wpdb;

    if ( empty( $key ) )
        return;

    $r = $wpdb->get_results(
        $wpdb->prepare( "
            SELECT pm.meta_value, p.post_author FROM {$wpdb->postmeta} pm
            LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
            WHERE pm.meta_key = \'%s\' 
            AND p.post_status = \'%s\' 
            AND p.post_type = \'%s\'",
            $key,
            $status,
            $type
        )
    );

    if ( $r ) {
        $user_ids = wp_list_pluck( $r, \'post_author\' );
        cache_users( $user_ids );
    }

    return $r;
}

$workout_leader = get_meta_values( \'1_rep\', \'workout\' );
foreach ( $workout_leader as $data ) {
    echo $data->meta_value;
    echo $data->post_author; // User ID

    // Any other user-related data.
    echo get_the_author_meta( \'display_name\', $data->post_author );
}

SO网友:gmazzap

在检索用户之前,您需要“保存”保存元数据的用户的信息。。。WordPress不存储这些信息,您无法获取不存在的信息。

保存所有元键的信息非常困难,WP在内部使用了很多自定义字段,因此您可能需要选择保存作者信息的元键。

WordPress有一个钩子“added\\u post\\u meta”,每次添加自定义字段时都会触发该钩子if 它是使用内置函数添加的:add_post_metaupdate_post_meta.

你可以利用这个钩子来保存作者信息

function who_save_what( $mid, $pid, $key, $value ) {
  // arrays of meta fields to save
  // array keys are the meta keys, values is array of post types
  $to_save = array(
    \'1_rep\' => array( \'workout\' ),
    \'_thumbnail_id\' => array( \'post\', \'page\', \'workout\' ) // just an example
  );
  // check key
  if ( ! array_key_exists( $key, $to_save ) ) return;
  // check post type
  $post = get_post( $pid );
  if ( ! in_array( $post->post_type, $to_save[$key] )  ) return;
  // check user
  if ( ! ( $uid = get_current_user_id() ) ) return;
  // ok, let\'s save
  remove_filter( current_filter(), __FUNCTION__ ); // avoid recursion
  $who = get_post_meta( $pid, "_who_save_{$key}");
  if ( empty($who) ) $who = array();
  $who[] = array( $mid => $uid );
  $done = update_post_meta( $pid, "_who_save_{$key}", $who );
  add_filter( current_filter(), __FUNCTION__ ); // restore filter
  return $done;
}

add_action( \'added_post_meta\', \'who_save_what\', 20, 4 );
此函数用于保存使用另一个元字段保存特定元字段的用户数组:"_who_save_{$key}" 哪里$key 是自定义字段键(例如。"_who_save_1_rep").

此键的值是用户ID的数组,其中数组键是元ID(meta_id 在里面postmeta 表)。保存一个用户数组的原因是,您可以有多个具有相同元键的字段,这样您就可以知道哪个用户保存了哪些特定字段。

下面是一个如何显示添加了元键的用户的示例,例如*\'1\\u rep\'*:

echo \'<p>The "1_rep" key for post \' . $postid . \' was saved by\';

$info = get_post_meta( $postid, \'_who_save_1_rep\', true );
$users = array();
foreach ( $info as $metaid => $userid ) {
  $user = new WP_User( $userid );
  if ( ! $user->exists() ) continue; // users can be deleted...
  $users[] = $user->display_name;
}

if ( empty( $users ) ) {
   echo \' someone that said us goodbye.</p>\';
} else {
   echo \'</p><ul><li>\' . implode( \'</li><li>\', $users ) . \'</li></ul>\';
}
如果您的元键是单个的,即对于每个帖子,您只能有一个*\'1\\u rep\'*键,我建议保持函数不变,只需获取保存在"_who_save_{$key}" 领域

注意:在上面的代码中,我使函数只在“added\\u post\\u meta”上运行,因此它在保存meta时运行,而不是在更新meta时运行。。。如果你想让它也在更新时运行,只需添加

add_action( \'updated_post_meta\', \'who_save_what\', 20, 4 );

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在