How to check if a post exist?

时间:2016-02-14 作者:user12920

我试图在比赛的第一个条目上创建一个新的帖子,然后在后续条目上更新现有条目,这样我可以每个条目有一个帖子,但允许多个条目。

问题是,如果你参加比赛(见下面的链接),它将创建一个新的帖子(它有效)。然后,如果你刷新页面,它会说你需要等待X分钟(在这种情况下是5分钟),然后才能再次输入(它可以工作)。

但是,如果您返回到条目页面,使用相同的电子邮件和相同的zip,或相同的电子邮件和不同的zip再次输入,它有时会做正确的事情并更新帖子条目,但有时会创建一个新条目(新帖子),而不是更新现有条目。

我需要帮助让它做正确的事情。如果条目存在,则更新该条目;如果条目不存在,则创建一个新条目。

代码:

// SYSTEM VARS

$currentTime    = time();
$entryCode      = md5($entryEmail);

// ENTRY DATA
$entryEmail = sanitize_email($_POST[\'entryEmail\']);
$entryZip   = sanitize_text_field($_POST[\'entryZip\']);
$entryIP    = $_POST[\'entryIP\'];



// CREATE ENTRY


function createEntry($cee, $cez, $ceip, $cec) {

$newEntry = wp_insert_post(

        array(
            \'comment_status\'    =>  \'closed\',
            \'ping_status\'       =>  \'closed\',
            \'post_author\'       =>  \'1\',
            \'post_title\'        =>  $cee,
            \'post_status\'       =>  \'publish\',
            \'post_type\'         =>  \'custom_type_entries\'
        )
    );

wp_insert_post($newEntry);

update_post_meta($newEntry, \'entryCode\', $cec, true);
update_post_meta($newEntry, \'entryIP\', $ceip, true);
update_post_meta($newEntry, \'entryZip\', $cez, true);
update_post_meta($newEntry, \'entryTime\', time(), true);
update_post_meta($newEntry, \'entryLast\', time(), true);
update_post_meta($newEntry, \'entryNumber\', \'1\', true);
update_post_meta($newEntry, \'entryWinner\', \'0\', true);
update_post_meta($newEntry, \'entryWinnerTime\', \'0\', true);
update_post_meta($newEntry, \'entryEmail\', $cee, true);
update_post_meta($newEntry, \'entryEmailSubscribe\', \'0\', true);
}

function writeEntry($we) {

        $entryFile  = "entries.txt";
        $dataFile   = fopen($entryFile, \'a\');
        $entryData  = $we . "\\n";
        fwrite($dataFile, $entryData);
        fclose($dataFile);

}


function secondsToTime($seconds) {
    $dtF = new DateTime("@0");
    $dtT = new DateTime("@$seconds");
    return $dtF->diff($dtT)->format(\'%a days, %h hours, %i minutes and %s seconds\');
}


// CHECK TO SEE IF ALREADY ENTERED
$loop = new WP_Query( 

                array( 
                    \'post_type\'         => \'custom_type_entries\', 
                    \'posts_per_page\'    => \'-1\' )
            );


while ( $loop->have_posts() ) : $loop->the_post(); 

    $postID             = $post->ID;
    $entry              = get_post_meta($postID, \'entryEmail\', true);
    $day                = "300";
    $entryTime          = get_post_meta($postID, \'entryTime\', true);
    $entryLastTime      = get_post_meta($postID, \'entryLast\', true);
    $entryCheckIP       = get_post_meta($postID, \'entryIP\', true);
    $entryCheckTime     = $currentTime - $entryTime;
    $entryCheckLastTime = $currentTime - $entryLastTime;

    if ($entry == $entryEmail) {



            // IF LESS THAN 24 HOURS SINCE FIRST ENTRY--
            if ($entryCheckTime <= $day) {

                $entryNext = $day - $entryCheckTime;

                echo "Time to Second Entry: " . secondsToTime($entryNext);
                get_footer();
                exit;


            }

            if ($entryCheckTime >= $day) {

                // IF LESS THAN 24 HOURS SINCE LAST ENTRY--
                if ($entryCheckLastTime <= $day) {

                    $entryNext = $day - $entryCheckLastTime;

                    echo "Time to Next Entry: " . secondsToTime($entryNext);
                    get_footer();
                    exit;


                }

                // IF MORE THAN 24 HOURS SINCE LAST ENTRY--
                elseif ($entryCheckLastTime >= $day) {

                    // UPDATE ENTRY COUNTER
                    $entryNumber = get_post_meta($postID, \'entryNumber\', true);
                    $entryNumber++;
                    update_post_meta($postID, \'entryNumber\', $entryNumber);

                    // UPDATE ENTRY TIME
                    update_post_meta($postID, \'entryLast\', $currentTime);

                    // WRITE ENTRY TO FILE
                    writeEntry($entryEmail);

                    // WRAP IY UP YO..
                    echo "Entry Updated!";
                    get_footer();
                    exit;
                }       
            }

    }

    else {

        // CREATE ENTRY
        createEntry($entryEmail, $entryZip, $entryIP, $entryCode);

        // WRITE ENTRY EMAIL TO FILE
        writeEntry($entryEmail);

        // WRAP IT UP YO..
        echo "New Entry!";
        get_footer();
        exit;

    }

endwhile; 

wp_reset_query();
现场示例:

提交表格:weeklyweedbox.com/win

1 个回复
SO网友:majick

您想重新思考此代码。。。首先,随着条目数量的增加,将它们全部循环是一个坏主意。考虑添加meta_query 的参数WP_Query 因此,您将来不会遍历每个条目,而是限制数据库检索。

主要是你想摆脱最后一个else{} 包装并将其中的代码移动到while 完全循环,否则将创建大量虚假条目。如果只测试一个电子邮件地址,您可能没有注意到。这也可能意味着添加另一个条件,以仅在表单实际提交时触发所有这一切(例如。if (isset($_POST[\'entryEmail\')) { ... (就在上面$loop)

还有一些其他的错误正在发生。。!

。。。在顶部,你需要移动$entryCode$entryEmail 已定义。。。

。。。在…内createEntry 您应该使用add_post_meta - 不update_post_meta 只有当元值已经存在时才有效。。。

。。。没什么大不了的,但是$day 应设置为300而不是“300”,整数而不是字符串。。。

从中可以学到什么?在期望代码正常工作之前,再检查几次代码的逻辑。您将来不太可能得到这种详细的响应(您很幸运),因为代码审查不是问答的目的;一个站点。相反,您通常必须将范围缩小到一个特定的bug,而您自己无法更彻底地尝试解决它,这将从您提出问题的方式中体现出来。

相关推荐

当in_the_loop()为假时,何时以及为什么is_Single(‘my_cpt’)为真?

我正在使用模板系统的示例代码。此地址的页码:http://project.test/my_cpt/hello-post/.无法理解原因is_singular( \'my_cpt\' ) 是true 虽然in_the_loop() 是false.在页面模板中The Loop "E;“工程”:if ( have_posts() ) { while ( have_posts() ) { the_post(); ?>