我经营一家活动公司,其网站使用自定义的帖子类型系统来发布帖子(博客)、活动和门票,所有这些都存储在数据库中作为CPT。
在访客列表上(如果事件[帖子]编号==当前帖子,则统计“ticket”自定义帖子),我想实现一个“New Customer”标记,以提示主机注意它们。
这有两个问题:你无法搜索最古老的“门票”帖子,因为他们可能没有按时间顺序购买门票;你无法按帖子编号获取所有门票和订单,因为他们可能也没有按时间顺序添加到网站。
我能想到的两种方法是:
(1) 通过多个搜索数组,即查询TICKET>获取用户>获取用户号的所有TICKET>从这些TICKET中获取事件[发布]号(存储为meta)>按发布号获取事件>-按事件日期排序数组>如果该数组中的第一个事件==当前事件[发布]号回显NEW CUSTOMER<这似乎是一个非常长的路要走,我有点不愿意尝试,使所有这些工作作为一个相对新手的程序员。
(2) 以某种方式回顾性地将“事件日期”元数据标记添加到所有票子帖子中,然后我可以直接查询它们。。。。更简单,但我不确定如何重新翻译010214,以便查询将其识别为日期而不是数字。。。
数字(2)很理想,但我找不到任何关于如何回顾性地添加所有这些数据的信息,以及如何在以后的帖子中添加这些数据的信息-所有数据都在系统中,但所有对信息的搜索都会让我看到人们在谈论返回并批量添加搜索引擎元,而不是WordPress帖子元。
我开始给数字(1)编码,意识到前面有座山,于是停了下来——如果有人想要那部分代码,我仍然可以发布它。。。
提前感谢,很抱歉提出了这么长的问题-请尝试为任何帮助者提供尽可能多的信息。
编辑:解决这一问题的一种方法是实际使用事件页面本身作为$event
和$ticket
在那里被称为。
结构可以是:
write meta to `$ticket`
with
meta key = \'event_date\'
value = $eventDay [= date( \'dmy\', $event->start );]
然后通过一个简单的查询找到所有用户票证,并按这个新的元标记“event\\u date”排序。
如果第一次输入的事件编号==当前帖子,答对了!
最合适的回答,由SO网友:Bysander 整理而成
所以
我绕过了这个问题,实际上是在事件页面上添加元数据的函数(在event single.php中)。这意味着您在创建票证时没有被活动的日期扣留,例如,您应该更改活动的日期。每次访问该页面时,日期都会转移到有问题的票据上。
我以yymmdd格式存储了日期元数据,因此事实上,如果按数字顺序排列,它仍然可以生成正确的结果,而无需重新转换为日期。
(这可能并不完美——我是一名新手,通过维护wordpress网站的必要性自学了php)
这就是我所做的。
## PUT EVENT DATE DETAILS ONTO TICKET POST & WORK OUT **NEW CUSTOMERS** ##
$eventDay = date( \'ymd\', $event->start );
$tixID = $ticket[\'id\'];
$eventKey = event_date;
update_post_meta($tixID , $eventKey , $eventDay ); #This has added the event date ($eventDay) to the Ticket Meta
// Now we have to search to see which event is the first
$useremail = $ticket[\'email\'];
$user = get_user_by( \'email\', $useremail );
$IDuser = $user->ID;
$args = array(
\'posts_per_page\' => 1,
\'post_type\' => \'ticket\',
\'author\' => $IDuser,
\'meta_key\' => \'state\',
\'meta_value\' => \'complete\',
\'orderby\' => \'event_date\',
\'order\' => \'ASC\',
);
$first_post = new WP_Query($args);
// \'<pre>\'.print_r($first_post).\'</pre>\'; /* Use this to test the array produced */
if ($first_post->have_posts()) {
$first_post->the_post();
$firstID = get_the_ID(); // This gets the post number of the first \'ticket\' post
$firsteventdate = get_post_meta( $firstID, \'event_date\', true); //This uses that number to extract the date of the first event.
wp_reset_postdata();
}
if ($firsteventdate == $eventDay) { ?> <b>**NEW CUSTOMER**</b> <?php } else { ?> Old
<?php }
?>
SO网友:helgatheviking
这将查询所有票子帖子并更新_ticket_date
领域然而,我还不确定如何检索实际日期,因此您必须为我提供更多的信息。假设它工作正常,我将运行以下一次,然后删除。你可以通过设置一个瞬态来达到类似的效果,但我现在不讨论这个问题。
function update_ticket_meta(){
$args = array( \'post_type\' => \'ticket\', \'nopagination\' => true );
$tickets = new WP_Query( $args );
if ( $tickets->have_posts() ) while( $tickets->have_posts() ){
$tickets->the_post();
// get the event ID- adjust meta key as needed
$event_id = get_post_meta( $post->ID, \'_event\', true );
// get the date from the event post
$event = Ai1ec_Events_Helper::get_event($event_id);
if( $event ) {
// get date in desired format- YYYYMMDD should be the easiest to query by
$date = date( \'ymd\', $event->start );
if( $date )
update_post_meta( $post->ID, \'_ticket_date\', $date );
}
}
}
add_action( \'admin_init\', \'update_ticket_meta\' );
此外,要在保存票证时保存元,可以将操作添加到
save_post-{post-type}
. 如果您更改了事件的日期元字段,这仍然会给您留下一些编码。
// save some meta when a ticket is saved
function add_ticket_date( $post_id ){
if( !class_exists( \'Ai1ec_Events_Helper\' ) )
return;
// get the event ID- adjust meta key as needed
$event_id = isset( $_POST[\'_event\'] ) ? (int) $_POST[\'_event\'] : -1;
// get the date from the event post- again adjust meta key
$event = Ai1ec_Events_Helper::get_event($post->ID);
// get date in desired format- YYYYMMDD should be the easiest to query by
$date = date( \'ymd\', $event->start );
if( $date )
update_post_meta( $post_id, \'_ticket_date\', $date );
}
add_action( \'save_post-ticket\', \'add_ticket_date\' );