php WordPress中API数据的奇怪问题

fcy6dtqo  于 2023-04-28  发布在  PHP
关注(0)|答案(2)|浏览(114)

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,并尝试在代码的结尾取消设置所有变量,但这些都不起作用。你觉得我哪里做错了?

aurhwmvo

aurhwmvo1#

没有搜索参数post_title,应该只有title。由于某些原因,官方文档中没有提到这个参数,但你可以在源文件中找到它: www.example.com
在你的例子中,这是导致问题的原因,因为你基本上是这样做的查询:

[
    'post_type' => 'acronym',
    'posts_per_page' => 1
]

刚刚给你最新的帖子。

ct2axkht

ct2axkht2#

在foreach循环中,您可以检查是否有其他定义分配给$randacro。如果它是一个新的定义,你可以使用update_field()函数发布一个新的。试着将它融入到你的代码中。

foreach($resarray->result as $result) {
    print_r($result);
    echo '<br><br>';

    if (!is_string($result)) {
        $def = $result->definition;
        // Check if the definition already exists for the given acronym
        $args = array(
            'post_type' => 'definition',
            'post_title' => wp_strip_all_tags($def),
            'meta_query' => array(
                array(
                    'key' => 'acronym',
                    'value' => $acro_id,
                    'compare' => '=',
                ),
            ),
        );

        $query = new WP_Query( $args );

        if ( !$query->have_posts() ) {
            // Create a new definition post and assign it to the acronym post

            $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++;
        }
    }
}

相关问题