bounty还有4天到期。回答此问题可获得+50声望奖励。AJT希望引起更多关注这个问题。
我正在试验一个返回缩写词定义的API。我的网站有2个自定义帖子类型,'缩写'和'定义'。我生成一个随机的2 - 3个字母的字符串,并将其提供给API。其思想是,如果API返回数据,则随机生成的首字母缩略词被添加为“首字母缩略词”帖子,并且定义被添加为“定义”帖子。然后通过ACF字段将定义链接到首字母缩略词。如果随机生成的首字母缩略词已经作为“首字母缩略词”帖子存在,则简单地创建定义并将其分配给该首字母缩略词帖子。
我运行的代码使用WP管理页脚挂钩测试的目的。下面是我代码的简化版本:
add_action('admin_footer', 'api_fetch');
function api_fetch(){
$length = rand(2, 3);
$randacro = '';
for ($i = 0; $i < $length; $i++) {
$randacro .= chr(rand(97, 122));
}
// Set the endpoint URL
$url = 'https://apiurl.com/xxxxxxxxx/' . $randacro . '&format=json';
// Initialize curl
$curl = curl_init($url);
// Set curl options
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json'
));
// Send the request and get the response
$response = curl_exec($curl);
// Close curl
curl_close($curl);
// Handle the response
if ($response) {
$resarray = json_decode($response);
echo '<div style="padding: 0 200px 50px;">Randomly generated acronym: ' . strtoupper($randacro) . '<br><br>';
if ( isset($resarray->result) ) {
if (post_exists(strtoupper($randacro))) {
$args = array(
'post_type' => 'acronym',
'post_title' => strtoupper($randacro),
'posts_per_page' => 1,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
$acro_id = $query->posts[0]->ID;
wp_reset_postdata();
}
} else {
$new_acro = array(
'post_title' => strtoupper(wp_strip_all_tags($randacro)),
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'acronym',
);
$acro_id = wp_insert_post( $new_acro );
}
if ($acro_id) {
echo 'Found/created acronym post: ID = ' . $acro_id . ' - Title = ' . get_the_title($acro_id) . '<br><br><pre>';
foreach($resarray->result as $result) {
print_r($result);
echo '<br><br>';
if (!is_string($result)) {
$def = $result->definition;
if ( get_post_status( $acro_id ) && !post_exists( $def ) ) {
$new_def = array(
'post_title' => wp_strip_all_tags($def),
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'definition',
);
$new_def_id = wp_insert_post( $new_def );
update_field('acronym', $acro_id, $new_def_id);
update_field('likes', '0', $new_def_id);
$defs_published++;
}
}
}
}
}
echo '</pre></div>';
} else {
echo '<div style="padding: 0 200px;">No response</div>';
}
}
我遇到的问题是,当我刷新页面以再次运行代码时,代码创建了一个新的首字母缩略词,然后它找到了一个现有的首字母缩略词,它将定义分配给了之前创建的新首字母缩略词。例如,这一次代码运行时,它创建了首字母缩写post“VC”,因为它还不存在:
我刷新页面再次运行代码,随机生成的首字母缩略词已经作为'acronym' post存在,但定义被分配给以前创建的首字母缩略词post(显示为“Found/created acronym post”):
我尝试在整个代码中添加wp_reset_postdata()
和wp_reset_query()
。我尝试在代码的开头和结尾将$acro_id
设置为null
,并尝试在代码的结尾取消设置所有变量,但这些都不起作用。你觉得我哪里做错了?
2条答案
按热度按时间aurhwmvo1#
没有搜索参数
post_title
,应该只有title
。由于某些原因,官方文档中没有提到这个参数,但你可以在源文件中找到它: www.example.com在你的例子中,这是导致问题的原因,因为你基本上是这样做的查询:
刚刚给你最新的帖子。
ct2axkht2#
在foreach循环中,您可以检查是否有其他定义分配给$randacro。如果它是一个新的定义,你可以使用update_field()函数发布一个新的。试着将它融入到你的代码中。