Changeset 7607
- Timestamp:
- 08/13/2018 11:52:14 AM (8 years ago)
- Location:
- sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt
- Files:
-
- 16 added
- 3 deleted
- 6 edited
-
applications/common.php (deleted)
-
applications/tracker.php (deleted)
-
css/applications/admin.css (added)
-
css/applications/meetup.css (added)
-
views/applications/meetup (added)
-
views/applications/meetup/shortcode-application.php (added)
-
views/applications/tracker (deleted)
-
views/applications/wordcamp/shortcode-application.php (modified) (1 diff)
-
views/wordcamp/metabox-status.php (modified) (3 diffs)
-
wcpt-event (added)
-
wcpt-event/class-event-admin.php (added)
-
wcpt-event/class-event-application.php (added)
-
wcpt-event/class-event-loader.php (added)
-
wcpt-event/tracker.php (added)
-
wcpt-functions.php (modified) (2 diffs)
-
wcpt-loader.php (modified) (3 diffs)
-
wcpt-meetup (added)
-
wcpt-meetup/class-meetup-admin.php (added)
-
wcpt-meetup/class-meetup-application.php (added)
-
wcpt-meetup/meetup-loader.php (added)
-
wcpt-meetup/meetup.php (added)
-
wcpt-wordcamp/class-wordcamp-application.php (added)
-
wcpt-wordcamp/wordcamp-admin.php (modified) (4 diffs)
-
wcpt-wordcamp/wordcamp-loader.php (modified) (4 diffs)
-
wcpt-wordcamp/wordcamp.php (added)
Legend:
- Unmodified
- Added
- Removed
-
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/applications/wordcamp/shortcode-application.php
r6651 r7607 4 4 defined( 'WPINC' ) or die(); 5 5 6 // Modified from https://wordcampcentral.polldaddy.com/s/wordcamp-organizer-application 7 8 ?> 9 10 <form id="wordcamp-application" method="post"> 11 <div class="PDF_pageOuter"> 12 <div class="PDF_pageInner"> 13 <div class="PDF_question" id="pd-question-10000"> 14 <div class="qContent"> 15 <div class="PDF_QT1900"> 16 <h2>Part I: About You</h2> 17 </div> 18 </div> 19 </div> 20 21 <div class="PDF_questionDivide" id="pd-divider-10000"></div> 22 23 <div class="PDF_question" id="pd-question-1"> 24 <div class="qNumber"> 25 Q.1 26 </div> 27 28 <div class="qContent"> 29 <div class="qText"> 30 Please enter your name. 31 <span class="PDF_mand">*</span> 32 </div> 33 34 <div class="PDF_QT800"> 35 <div> 36 <label for="q_1079074_first_name">First Name</label> 37 <br /> 38 <input type="text" class="firstName" maxlength="50" name="q_1079074_first_name" id="q_1079074_first_name" value="" required /> 39 </div> 40 41 <div> 42 <label for="q_1079074_last_name">Last Name</label> 43 <br /> 44 <input type="text" class="lastName" maxlength="50" name="q_1079074_last_name" id="q_1079074_last_name" value="" required /> 45 </div> 46 </div> 47 </div> 48 </div> 49 50 <div class="PDF_questionDivide" id="pd-divider-1"></div> 51 52 <div class="PDF_question" id="pd-question-2"> 53 <div class="qNumber"> 54 Q.2 55 </div> 56 57 <div class="qContent"> 58 <div class="qText"> 59 Please enter your email address. 60 <span class="PDF_mand">*</span> 61 </div> 62 63 <div class="PDF_QT1400"> 64 <label for="q_1079059_email">(e.g. john@example.com)</label> 65 <br /> 66 <input type="email" maxlength="100" name="q_1079059_email" id="q_1079059_email" value="" class="survey-email required" autocomplete="off" required /> 67 </div> 68 </div> 69 </div> 70 71 <div class="PDF_questionDivide" id="pd-divider-2"></div> 72 73 <div class="PDF_question" id="pd-question-31"> 74 <div class="qNumber"> 75 Q.31 76 </div> 77 78 <div class="qContent"> 79 <div class="qText"> 80 What is your wordpress.org username? 81 <span class="PDF_mand">*</span> 82 </div> 83 84 <div class="qNote"> 85 <p>(This is the username you'd use to log in to http://wordpress.org/support/)</p> 86 </div> 87 88 <div class="PDF_QT100"> 89 <input value="" maxlength="500" name="q_4236565_wporg_username" class="large required" type="text" title="What is your wordpress.org username?" required /> 90 </div> 91 </div> 92 </div> 93 94 <div class="PDF_questionDivide" id="pd-divider-31"></div> 95 96 <div class="PDF_question" id="pd-question-34"> 97 <div class="qNumber"> 98 Q.34 99 </div> 100 101 <div class="qContent"> 102 <div class="qText"> 103 What is your username on <a href="https://chat.wordpress.org" target="_blank">WordPress' Slack workspace</a>? 104 </div> 105 106 <div class="PDF_QT100"> 107 <input value="" maxlength="500" name="q_4236565_slack_username" class="large" type="text" title="What is your Slack username?" /> 108 </div> 109 </div> 110 </div> 111 112 <div class="PDF_questionDivide"></div> 113 114 <div class="PDF_question"> 115 <div class="qContent"> 116 <div class="qText"> 117 Where can we find you online? 118 </div> 119 120 <div class="PDF_QT100"> 121 <input value="" maxlength="500" name="where_find_online" class="large" type="text" title="Where can we find you online?" /> 122 </div> 123 </div> 124 </div> 125 126 <div class="PDF_questionDivide" id="pd-divider-34"></div> 127 128 <div class="PDF_question" id="pd-question-3"> 129 <div class="qNumber"> 130 Q.3 131 </div> 132 133 <div class="qContent"> 134 <div class="qText"> 135 Please enter your mailing address (at least your city/state or city/country). 136 </div> 137 138 <div class="PDF_QT900"> 139 <div> 140 <label for="q_1079060_add1">Address Line 1</label> 141 <br /> 142 <input type="text" maxlength="100" class="a" name="q_1079060_add1" id="q_1079060_add1" value="" /> 143 </div> 144 145 <div> 146 <label for="q_1079060_add2">Address Line 2</label> 147 <br /> 148 <input type="text" maxlength="100" class="b" name="q_1079060_add2" id="q_1079060_add2" value="" /> 149 </div> 150 151 <div> 152 <label for="q_1079060_city">City</label> 153 <br /> 154 <input type="text" maxlength="50" class="c" name="q_1079060_city" id="q_1079060_city" value="" /> 155 </div> 156 157 <div> 158 <label for="q_1079060_state">State</label> 159 <br /> 160 <input type="text" maxlength="50" class="d" name="q_1079060_state" id="q_1079060_state" value="" /> 161 </div> 162 163 <div> 164 <label for="q_1079060_zip">Zip Code</label> 165 <br /> 166 <input type="text" maxlength="20" class="e" name="q_1079060_zip" id="q_1079060_zip" value="" /> 167 </div> 168 169 <div> 170 <label for="q_1079060_country">Country</label> 171 <br /> 172 173 <select name="q_1079060_country" id="q_1079060_country"> 174 <option value=""></option> 175 176 <?php foreach ( $countries as $country ) : ?> 177 <option value="<?php echo esc_attr( $country['alpha2'] ); ?>"> 178 <?php echo esc_html( $country['name'] ); ?> 179 </option> 180 <?php endforeach; ?> 181 </select> 182 </div> 183 </div> 184 </div> 185 </div> 186 187 <div class="PDF_questionDivide" id="pd-divider-3"></div> 188 189 <div class="PDF_question" id="pd-question-4"> 190 <div class="qNumber"> 191 Q.4 192 </div> 193 194 <div class="qContent"> 195 <div class="qText"> 196 How long have you been using WordPress? 197 </div> 198 199 <div class="PDF_QT400"> 200 <ul> 201 <li> 202 <input type="radio" name="q_1045947_years_using_wp" value="7+ years" id="q_1045947_1865361" /> 203 204 <label for="q_1045947_1865361" value="1865361"> 205 7+ years </label> 206 </li> 207 <li> 208 <input type="radio" name="q_1045947_years_using_wp" value="6 years" id="q_1045947_1865362" /> 209 210 <label for="q_1045947_1865362" value="1865362"> 211 6 years </label> 212 </li> 213 <li> 214 <input type="radio" name="q_1045947_years_using_wp" value="5 years" id="q_1045947_1865363" /> 215 216 <label for="q_1045947_1865363" value="1865363"> 217 5 years </label> 218 </li> 219 <li> 220 <input type="radio" name="q_1045947_years_using_wp" value="4 years" id="q_1045947_1865369" /> 221 222 <label for="q_1045947_1865369" value="1865369"> 223 4 years </label> 224 </li> 225 <li> 226 <input type="radio" name="q_1045947_years_using_wp" value="3 years" id="q_1045947_1865370" /> 227 228 <label for="q_1045947_1865370" value="1865370"> 229 3 years </label> 230 </li> 231 <li> 232 <input type="radio" name="q_1045947_years_using_wp" value="2 years" id="q_1045947_1865371" /> 233 234 <label for="q_1045947_1865371" value="1865371"> 235 2 years </label> 236 </li> 237 <li> 238 <input type="radio" name="q_1045947_years_using_wp" value="1 year" id="q_1045947_1865372" /> 239 240 <label for="q_1045947_1865372" value="1865372"> 241 1 year </label> 242 </li> 243 <li> 244 <input type="radio" name="q_1045947_years_using_wp" value="less than a year" id="q_1045947_1865373" /> 245 246 <label for="q_1045947_1865373" value="1865373"> 247 Less than a year </label> 248 </li> 249 <li> 250 <input type="radio" name="q_1045947_years_using_wp" value="I don't use WordPress yet" id="q_1045947_1865374" /> 251 252 <label for="q_1045947_1865374" value="1865374"> 253 I don't use WordPress yet </label> 254 </li> 255 </ul> 256 </div> 257 </div> 258 </div> 259 260 <div class="PDF_questionDivide" id="pd-divider-4"></div> 261 262 <div class="PDF_question" id="pd-question-5"> 263 <div class="qNumber"> 264 Q.5 265 </div> 266 267 <div class="qContent"> 268 <div class="qText"> 269 How have you been involved in the WordPress community so far? 270 </div> 271 272 <div class="PDF_QT400"> 273 <ul> 274 <li> 275 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908777" value="I use WordPress for my website(s)" /> 276 277 <label for="q_1068246_1908777">I use WordPress for my website(s)</label> 278 </li> 279 <li> 280 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908778" value="I help other people use WordPress for their websites" /> 281 282 <label for="q_1068246_1908778">I help other people use WordPress for their websites</label> 283 </li> 284 <li> 285 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908779" value="I make plugins" /> 286 287 <label for="q_1068246_1908779">I make plugins</label> 288 </li> 289 <li> 290 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908831" value="I make themes" /> 291 292 <label for="q_1068246_1908831">I make themes</label> 293 </li> 294 <li> 295 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908832" value="I contribute to the WordPress core codebase" /> 296 297 <label for="q_1068246_1908832">I contribute to the WordPress core codebase</label> 298 </li> 299 <li> 300 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908833" value="I volunteer in the support forums at wordpress.org" /> 301 302 <label for="q_1068246_1908833">I volunteer in the support forums at wordpress.org</label> 303 </li> 304 <li> 305 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908834" value="I contribute to the WordPress core UI group" /> 306 307 <label for="q_1068246_1908834">I contribute to the WordPress core UI group</label> 308 </li> 309 <li> 310 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908835" value="I'm involved with local WordPress meetups" /> 311 312 <label for="q_1068246_1908835">I'm involved with local WordPress meetups</label> 313 </li> 314 <li> 315 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908836" value="I've been involved with previous WordCamps" /> 316 317 <label for="q_1068246_1908836">I've been involved with previous WordCamps</label> 318 </li> 319 <li> 320 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1926765" value="WordPress helps me make a living" /> 321 322 <label for="q_1068246_1926765">WordPress helps me make a living</label> 323 </li> 324 325 <li> 326 <label for="q_1068246_other">Other:</label> 327 328 <input type="text" class="other" name="q_1068246_ways_involved_other" id="q_1068246_other" value="" style="width: 75%" /> 329 </li> 330 </ul> 331 </div> 332 </div> 333 </div> 334 335 <div class="PDF_questionDivide" id="pd-divider-5"></div> 336 337 <div class="PDF_question" id="pd-question-6"> 338 <div class="qNumber"> 339 Q.6 340 </div> 341 342 <div class="qContent"> 343 <div class="qText"> 344 Have you ever attended a WordCamp before? 345 </div> 346 347 <div class="PDF_QT400"> 348 <ul> 349 <li> 350 <input type="radio" name="q_1046032_attended_camp_before" value="Yes, more than one" id="q_1046032_1865479" /> 351 352 <label for="q_1046032_1865479" value="1865479"> 353 Yes, more than one </label> 354 </li> 355 <li> 356 <input type="radio" name="q_1046032_attended_camp_before" value="Yes, I've been to one" id="q_1046032_1865480" /> 357 358 <label for="q_1046032_1865480" value="1865480"> 359 Yes, I've been to one </label> 360 </li> 361 <li> 362 <input type="radio" name="q_1046032_attended_camp_before" value="No, I haven't been to a WordCamp yet" id="q_1046032_1865481" /> 363 364 <label for="q_1046032_1865481" value="1865481"> 365 No, I haven't been to a WordCamp yet </label> 366 </li> 367 </ul> 368 369 </div> 370 </div> 371 </div> 372 373 <div class="PDF_questionDivide" id="pd-divider-6"></div> 374 375 <div class="PDF_question" id="pd-question-7"> 376 <div class="qNumber"> 377 Q.7 378 </div> 379 380 <div class="qContent"> 381 <div class="qText"> 382 What WordCamps have you been to? Please list one per line in this format: City, Year (ex. San Francisco, 2010) 383 </div> 384 385 <div class="PDF_QT200"> 386 <textarea name="q_1046033_camps_been_to" class="small" rows="10" cols="40" title="What WordCamps have you been to? Please list one pe…"></textarea> 387 </div> 388 </div> 389 </div> 390 391 <div class="PDF_questionDivide" id="pd-divider-7"></div> 392 393 <div class="PDF_question" id="pd-question-8"> 394 <div class="qNumber"> 395 Q.8 396 </div> 397 398 <div class="qContent"> 399 <div class="qText"> 400 What do you hope to accomplish by organizing a WordCamp? 401 </div> 402 403 <div class="PDF_QT400"> 404 <ul> 405 <li> 406 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908730" value="Grow my local WordPress community" /> 407 408 <label for="q_1068223_1908730">Grow my local WordPress community</label> 409 </li> 410 <li> 411 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908731" value="Introduce new people to WordPress/teach new users" /> 412 413 <label for="q_1068223_1908731">Introduce new people to WordPress/teach new users</label> 414 </li> 415 <li> 416 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908732" value="Find collaborators for WordPress projects" /> 417 418 <label for="q_1068223_1908732">Find collaborators for WordPress projects</label> 419 </li> 420 <li> 421 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908771" value="Raise my visibility in the community" /> 422 423 <label for="q_1068223_1908771">Raise my visibility in the community</label> 424 </li> 425 <li> 426 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908772" value="Make connections with visiting speakers (like Matt Mullenweg)" /> 427 428 <label for="q_1068223_1908772">Make connections with visiting speakers (like Matt Mullenweg)</label> 429 </li> 430 <li> 431 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908773" value="Make money from surplus ticket sales/sponsorships" /> 432 433 <label for="q_1068223_1908773">Make money from surplus ticket sales/sponsorships</label> 434 </li> 435 <li> 436 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908774" value="Have fun/throw a good party" /> 437 438 <label for="q_1068223_1908774">Have fun/throw a good party</label> 439 </li> 440 <li> 441 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908775" value="Be part of the zeitgeist, as WordCamps are very popular right now" /> 442 443 <label for="q_1068223_1908775">Be part of the zeitgeist, as WordCamps are very popular right now</label> 444 </li> 445 <li> 446 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908776" value="Inspire people to do more with WordPress" /> 447 448 <label for="q_1068223_1908776">Inspire people to do more with WordPress</label> 449 </li> 450 451 <li> 452 <label for="q_1068223_other">Other:</label> 453 454 <input type="text" class="other" name="q_1068223_hope_to_accomplish_other" id="q_1068223_other" value="" style="width: 75%" /> 455 </li> 456 </ul> 457 </div> 458 </div> 459 </div> 460 461 <div class="PDF_questionDivide" id="pd-divider-8"></div> 462 463 <div class="PDF_question" id="pd-question-10001"> 464 <div class="qContent"> 465 <div class="PDF_QT1900"> 466 <h2>Part II: About Your Local Community</h2> 467 </div> 468 </div> 469 </div> 470 471 <div class="PDF_questionDivide" id="pd-divider-10001"></div> 472 473 <div class="PDF_question" id="pd-question-9"> 474 <div class="qNumber"> 475 Q.9 476 </div> 477 478 <div class="qContent"> 479 <div class="qText"> 480 Is there an active WordPress meetup in your area? 481 </div> 482 483 <div class="PDF_QT400"> 484 <ul> 485 <li> 486 <input type="radio" name="q_1045950_active_meetup" value="Yes" id="q_1045950_1865375" /> 487 488 <label for="q_1045950_1865375" value="1865375"> 489 Yes </label> 490 </li> 491 <li> 492 <input type="radio" name="q_1045950_active_meetup" value="No" id="q_1045950_1865376" /> 493 494 <label for="q_1045950_1865376" value="1865376"> 495 No </label> 496 </li> 497 <li> 498 <input type="radio" name="q_1045950_active_meetup" value="I don't know" id="q_1045950_1865377" /> 499 500 <label for="q_1045950_1865377" value="1865377"> 501 I don't know </label> 502 </li> 503 </ul> 504 </div> 505 </div> 506 </div> 507 508 <div class="PDF_questionDivide" id="pd-divider-9"></div> 509 510 <div class="PDF_question" id="pd-question-10"> 511 <div class="qNumber"> 512 Q.10 513 </div> 514 515 <div class="qContent"> 516 <div class="qText"> 517 What is your role in the meetup group? 518 </div> 519 520 <div class="PDF_QT400"> 521 <ul> 522 <li> 523 <input type="radio" name="q_1045953_role_in_meetup" value="I am the organizer" id="q_1045953_1865378" /> 524 525 <label for="q_1045953_1865378" value="1865378"> 526 I am the organizer </label> 527 </li> 528 <li> 529 <input type="radio" name="q_1045953_role_in_meetup" value="I am a regular attendee and presenter" id="q_1045953_1865379" /> 530 531 <label for="q_1045953_1865379" value="1865379"> 532 I am a regular attendee and presenter </label> 533 </li> 534 <li> 535 <input type="radio" name="q_1045953_role_in_meetup" value="I attend regularly but don't present" id="q_1045953_1865380" /> 536 537 <label for="q_1045953_1865380" value="1865380"> 538 I attend regularly but don't present </label> 539 </li> 540 <li> 541 <input type="radio" name="q_1045953_role_in_meetup" value="I attend sometimes" id="q_1045953_1865381" /> 542 543 <label for="q_1045953_1865381" value="1865381"> 544 I attend sometimes </label> 545 </li> 546 <li> 547 <input type="radio" name="q_1045953_role_in_meetup" value="I attend rarely" id="q_1045953_1865382" /> 548 549 <label for="q_1045953_1865382" value="1865382"> 550 I attend rarely </label> 551 </li> 552 <li> 553 <input type="radio" name="q_1045953_role_in_meetup" value="I do not attend the meetups" id="q_1045953_1865383" /> 554 555 <label for="q_1045953_1865383" value="1865383"> 556 I do not attend the meetups </label> 557 </li> 558 </ul> 559 </div> 560 </div> 561 </div> 562 563 <div class="PDF_questionDivide" id="pd-divider-10"></div> 564 565 <div class="PDF_question" id="pd-question-11"> 566 <div class="qNumber"> 567 Q.11 568 </div> 569 570 <div class="qContent"> 571 <div class="qText"> 572 What is the URL for the meetup group's website? 573 </div> 574 575 <div class="PDF_QT100"> 576 <input value="" maxlength="500" name="q_1045972_meetup_url" class="large" type="url" title="What is the URL for the meetup group's website?" /> 577 </div> 578 </div> 579 </div> 580 581 <div class="PDF_questionDivide" id="pd-divider-11"></div> 582 583 <div class="PDF_question" id="pd-question-12"> 584 <div class="qNumber"> 585 Q.12 586 </div> 587 588 <div class="qContent"> 589 <div class="qText"> 590 About how many members are there? 591 </div> 592 593 <div class="PDF_QT400"> 594 <ul> 595 <li> 596 <input type="radio" name="q_1045967_meetup_members" value="500+" id="q_1045967_1865388" /> 597 598 <label for="q_1045967_1865388" value="1865388"> 599 500+ </label> 600 </li> 601 <li> 602 <input type="radio" name="q_1045967_meetup_members" value="300-499" id="q_1045967_1865389" /> 603 604 <label for="q_1045967_1865389" value="1865389"> 605 300-499 </label> 606 </li> 607 <li> 608 <input type="radio" name="q_1045967_meetup_members" value="100-299" id="q_1045967_1865390" /> 609 610 <label for="q_1045967_1865390" value="1865390"> 611 100-299 </label> 612 </li> 613 <li> 614 <input type="radio" name="q_1045967_meetup_members" value="50-99" id="q_1045967_1865391" /> 615 616 <label for="q_1045967_1865391" value="1865391"> 617 50-99 </label> 618 </li> 619 <li> 620 <input type="radio" name="q_1045967_meetup_members" value="26-49" id="q_1045967_1865392" /> 621 622 <label for="q_1045967_1865392" value="1865392"> 623 26-49 </label> 624 </li> 625 <li> 626 <input type="radio" name="q_1045967_meetup_members" value="1-25" id="q_1045967_1865393" /> 627 628 <label for="q_1045967_1865393" value="1865393"> 629 1-25 </label> 630 </li> 631 <li> 632 <input type="radio" name="q_1045967_meetup_members" value="I don't know" id="q_1045967_1926755" /> 633 634 <label for="q_1045967_1926755" value="1926755"> 635 I don't know </label> 636 </li> 637 </ul> 638 </div> 639 </div> 640 </div> 641 642 <div class="PDF_questionDivide" id="pd-divider-12"></div> 643 644 <div class="PDF_question" id="pd-question-13"> 645 <div class="qNumber"> 646 Q.13 647 </div> 648 649 <div class="qContent"> 650 <div class="qText"> 651 How often does the group have meetups? 652 </div> 653 654 <div class="PDF_QT400"> 655 <ul> 656 <li> 657 <input type="radio" name="q_1045956_how_often_meetup" value="Once per month" id="q_1045956_1865384" /> 658 659 <label for="q_1045956_1865384" value="1865384"> 660 Once per month </label> 661 </li> 662 <li> 663 <input type="radio" name="q_1045956_how_often_meetup" value="Several per month" id="q_1045956_1865385" /> 664 665 <label for="q_1045956_1865385" value="1865385"> 666 Several per month </label> 667 </li> 668 <li> 669 <input type="radio" name="q_1045956_how_often_meetup" value="One every couple of months" id="q_1045956_1865386" /> 670 671 <label for="q_1045956_1865386" value="1865386"> 672 One every couple of months </label> 673 </li> 674 <li> 675 <input type="radio" name="q_1045956_how_often_meetup" value="There's a group but it never meets" id="q_1045956_1865387" /> 676 677 <label for="q_1045956_1865387" value="1865387"> 678 There's a group but it never meets </label> 679 </li> 680 </ul> 681 </div> 682 </div> 683 </div> 684 685 <div class="PDF_questionDivide" id="pd-divider-13"></div> 686 687 <div class="PDF_question" id="pd-question-14"> 688 <div class="qNumber"> 689 Q.14 690 </div> 691 692 <div class="qContent"> 693 <div class="qText"> 694 About how many people usually attend the meetups? 695 </div> 696 697 <div class="PDF_QT400"> 698 <ul> 699 <li> 700 <input type="radio" name="q_1045971_how_many_attend" value="500+" id="q_1045971_1865397" /> 701 702 <label for="q_1045971_1865397" value="1865397"> 703 500+ </label> 704 </li> 705 <li> 706 <input type="radio" name="q_1045971_how_many_attend" value="300-499" id="q_1045971_1865398" /> 707 708 <label for="q_1045971_1865398" value="1865398"> 709 300-499 </label> 710 </li> 711 <li> 712 <input type="radio" name="q_1045971_how_many_attend" value="100-299" id="q_1045971_1865399" /> 713 714 <label for="q_1045971_1865399" value="1865399"> 715 100-299 </label> 716 </li> 717 <li> 718 <input type="radio" name="q_1045971_how_many_attend" value="50-99" id="q_1045971_1865400" /> 719 720 <label for="q_1045971_1865400" value="1865400"> 721 50-99 </label> 722 </li> 723 <li> 724 <input type="radio" name="q_1045971_how_many_attend" value="26-49" id="q_1045971_1865401" /> 725 726 <label for="q_1045971_1865401" value="1865401"> 727 26-49 </label> 728 </li> 729 <li> 730 <input type="radio" name="q_1045971_how_many_attend" value="1-25" id="q_1045971_1865402" /> 731 732 <label for="q_1045971_1865402" value="1865402"> 733 1-25 </label> 734 </li> 735 </ul> 736 </div> 737 </div> 738 </div> 739 740 <div class="PDF_questionDivide" id="pd-divider-14"></div> 741 742 <div class="PDF_question" id="pd-question-15"> 743 <div class="qNumber"> 744 Q.15 745 </div> 746 747 <div class="qContent"> 748 <div class="qText"> 749 Have other community tech events (BarCamp, meetups, open source conferences) been successful in your city? 750 </div> 751 752 <div class="PDF_QT400"> 753 <ul> 754 <li> 755 <input type="radio" name="q_1079086_other_tech_events" value="Yes, and I've attended some of them" id="q_1079086_1926723" /> 756 757 <label for="q_1079086_1926723" value="1926723"> 758 Yes, and I've attended some of them </label> 759 </li> 760 <li> 761 <input type="radio" name="q_1079086_other_tech_events" value="Yes, though I haven't attended any" id="q_1079086_1926724" /> 762 763 <label for="q_1079086_1926724" value="1926724"> 764 Yes, though I haven't attended any </label> 765 </li> 766 <li> 767 <input type="radio" name="q_1079086_other_tech_events" value="No, we've had a few but they weren't very well-attended" id="q_1079086_1926725" /> 768 769 <label for="q_1079086_1926725" value="1926725"> 770 No, we've had a few but they weren't very well-attended </label> 771 </li> 772 <li> 773 <input type="radio" name="q_1079086_other_tech_events" value="We haven't had any community tech events yet" id="q_1079086_1926744" /> 774 775 <label for="q_1079086_1926744" value="1926744"> 776 We haven't had any community tech events yet </label> 777 </li> 778 <li> 779 <input type="radio" name="q_1079086_other_tech_events" value="I am not sure what events have been held here before, or if they've been successful" id="q_1079086_1926745" /> 780 781 <label for="q_1079086_1926745" value="1926745"> 782 I am not sure what events have been held here before, or if they've been successful </label> 783 </li> 784 </ul> 785 </div> 786 </div> 787 </div> 788 789 <div class="PDF_questionDivide" id="pd-divider-15"></div> 790 791 <div class="PDF_question" id="pd-question-16"> 792 <div class="qNumber"> 793 Q.16 794 </div> 795 796 <div class="qContent"> 797 <div class="qText"> 798 List any community tech events that have/have not been successful in your city. 799 </div> 800 801 <div class="PDF_QT200"> 802 <textarea name="q_1079082_other_tech_events_success" class="small" rows="10" cols="40" title="List any community tech events that have/have not b…"></textarea> 803 </div> 804 </div> 805 </div> 806 807 <div class="PDF_questionDivide" id="pd-divider-16"></div> 808 809 <div class="PDF_question" id="pd-question-10002"> 810 <div class="qContent"> 811 <div class="PDF_QT1900"> 812 <h2>Part III: About Your Potential WordCamp</h2> 813 </div> 814 </div> 815 </div> 816 817 <div class="PDF_questionDivide" id="pd-divider-10002"></div> 818 819 <div class="PDF_question" id="pd-question-17"> 820 <div class="qNumber"> 821 Q.17 822 </div> 823 824 <div class="qContent"> 825 <div class="qText"> 826 Enter the city, state/province, and country where you would like to organize a WordCamp. 827 <span class="PDF_mand">*</span> 828 </div> 829 830 <div class="PDF_QT100"> 831 <input value="" maxlength="500" name="q_1079103_wordcamp_location" class="large required" type="text" title="Enter the city, state/province, and country where y…" required /> 832 </div> 833 </div> 834 </div> 835 836 <div class="PDF_questionDivide" id="pd-divider-17"></div> 837 838 <div class="PDF_question" id="pd-question-18"> 839 <div class="qNumber"> 840 Q.18 841 </div> 842 843 <div class="qContent"> 844 <div class="qText"> 845 When do you want to have a WordCamp in your city? (month/year) 846 </div> 847 848 <div class="PDF_QT100"> 849 <input value="" maxlength="500" name="q_1046006_wordcamp_date" class="large" type="text" title="When do you want to have a WordCamp in your city? (…" /> 850 </div> 851 </div> 852 </div> 853 854 <div class="PDF_questionDivide" id="pd-divider-18"></div> 855 856 <div class="PDF_question" id="pd-question-19"> 857 <div class="qNumber"> 858 Q.19 859 </div> 860 861 <div class="qContent"> 862 <div class="qText"> 863 How many people do you think would attend? 864 </div> 865 866 <div class="PDF_QT100"> 867 <input value="" maxlength="500" name="q_1046007_how_many_attendees" class="large" type="text" title="How many people do you think would attend?" /> 868 </div> 869 </div> 870 </div> 871 872 <div class="PDF_questionDivide" id="pd-divider-19"></div> 873 874 <div class="PDF_question" id="pd-question-20"> 875 <div class="qNumber"> 876 Q.20 877 </div> 878 879 <div class="qContent"> 880 <div class="qText"> 881 Have you ever organized an event like this before? 882 </div> 883 884 <div class="PDF_QT400"> 885 <ul> 886 <li> 887 <input type="radio" name="q_1046038_organized_event_before" value="Yes, I've planned events of similar size/scope" id="q_1046038_1865485" /> 888 889 <label for="q_1046038_1865485" value="1865485"> 890 Yes, I've planned events of similar size/scope </label> 891 </li> 892 <li> 893 <input type="radio" name="q_1046038_organized_event_before" value="I've organized similar types of events, but smaller" id="q_1046038_1865486" /> 894 895 <label for="q_1046038_1865486" value="1865486"> 896 I've organized similar types of events, but smaller </label> 897 </li> 898 <li> 899 <input type="radio" name="q_1046038_organized_event_before" value="I've organized other events" id="q_1046038_1865487" /> 900 901 <label for="q_1046038_1865487" value="1865487"> 902 I've organized other events </label> 903 </li> 904 <li> 905 <input type="radio" name="q_1046038_organized_event_before" value="I've never organized an event before" id="q_1046038_1865495" /> 906 907 <label for="q_1046038_1865495" value="1865495"> 908 I've never organized an event before </label> 909 </li> 910 </ul> 911 </div> 912 </div> 913 </div> 914 915 <div class="PDF_questionDivide" id="pd-divider-20"></div> 916 917 <div class="PDF_question" id="pd-question-21"> 918 <div class="qNumber"> 919 Q.21 920 </div> 921 922 <div class="qContent"> 923 <div class="qText"> 924 Please give a brief description of the events you've been involved in organizing and what your role was. 925 </div> 926 927 <div class="PDF_QT200"> 928 <textarea name="q_1046099_describe_events" class="small" rows="10" cols="40" title="Please give a brief description of the events you'v…"></textarea> 929 </div> 930 </div> 931 </div> 932 933 <div class="PDF_questionDivide" id="pd-divider-21"></div> 934 935 <div class="PDF_question" id="pd-question-22"> 936 <div class="qNumber"> 937 Q.22 938 </div> 939 940 <div class="qContent"> 941 <div class="qText"> 942 Do you have at least 2 co-organizers? 943 </div> 944 945 <div class="PDF_QT400"> 946 <ul> 947 <li> 948 <input type="radio" name="q_1046101_have_co_organizers" value="Yes, I have co-organizers already" id="q_1046101_1908677" /> 949 950 <label for="q_1046101_1908677" value="1908677"> 951 Yes, I have co-organizers already </label> 952 </li> 953 <li> 954 <input type="radio" name="q_1046101_have_co_organizers" value="Nope, but I know some people who might be interested" id="q_1046101_1865560" /> 955 956 <label for="q_1046101_1865560" value="1865560"> 957 Nope, but I know some people who might be interested </label> 958 </li> 959 <li> 960 <input type="radio" name="q_1046101_have_co_organizers" value="Nope, I probably need help to find co-organizers" id="q_1046101_1865561" /> 961 962 <label for="q_1046101_1865561" value="1865561"> 963 Nope, I probably need help to find co-organizers </label> 964 </li> 965 <li> 966 <input type="radio" name="q_1046101_have_co_organizers" value="Nope, I want to do it by myself" id="q_1046101_1865562" /> 967 968 <label for="q_1046101_1865562" value="1865562"> 969 Nope, I want to do it by myself </label> 970 </li> 971 </ul> 972 </div> 973 </div> 974 </div> 975 976 <div class="PDF_questionDivide" id="pd-divider-22"></div> 977 978 <div class="PDF_question" id="pd-question-23"> 979 <div class="qNumber"> 980 Q.23 981 </div> 982 983 <div class="qContent"> 984 <div class="qText"> 985 What's your relationship to your co-organizers? 986 </div> 987 988 <div class="PDF_QT400"> 989 <ul> 990 <li> 991 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908678" value="We work for the same company" /> 992 993 <label for="q_1068188_1908678">We work for the same company</label> 994 </li> 995 <li> 996 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908679" value="We're friends" /> 997 998 <label for="q_1068188_1908679">We're friends</label> 999 </li> 1000 <li> 1001 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908680" value="We've collaborated on projects before" /> 1002 1003 <label for="q_1068188_1908680">We've collaborated on projects before</label> 1004 </li> 1005 <li> 1006 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" id="q_1068188_1908689" value="We met through the meetup group/other tech event" /> 1007 1008 <label for="q_1068188_1908689">We met through the meetup group/other tech event</label> 1009 </li> 1010 <li> 1011 <label for="q_1068188_other">Other:</label> 1012 1013 <input type="text" class="other" name="q_1068188_relationship_co_organizers_other" id="q_1068188_other" value="" style="width: 75%" /> 1014 </li> 1015 </ul> 1016 </div> 1017 </div> 1018 </div> 1019 1020 <div class="PDF_questionDivide" id="pd-divider-23"></div> 1021 1022 <div class="PDF_question" id="pd-question-24"> 1023 <div class="qNumber"> 1024 Q.24 1025 </div> 1026 1027 <div class="qContent"> 1028 <div class="qText"> 1029 Please enter the names and email addresses of your co-organizers here. 1030 </div> 1031 1032 <div class="PDF_QT200"> 1033 <textarea name="q_1068187_co_organizer_contact_info" class="small" rows="10" cols="40" title="Please enter the names and email addresses of your …"></textarea> 1034 </div> 1035 </div> 1036 </div> 1037 1038 <div class="PDF_questionDivide" id="pd-divider-24"></div> 1039 1040 <div class="PDF_question" id="pd-question-25"> 1041 <div class="qNumber"> 1042 Q.25 1043 </div> 1044 1045 <div class="qContent"> 1046 <div class="qText"> 1047 Are you confident you can raise money from local sponsors to cover the event costs? 1048 </div> 1049 1050 <div class="PDF_QT400"> 1051 <ul> 1052 <li> 1053 <input type="radio" name="q_1068214_raise_money" value="Yes, I'm cool with the fundraising" id="q_1068214_1908711" /> 1054 1055 <label for="q_1068214_1908711" value="1908711"> 1056 Yes, I'm cool with the fundraising </label> 1057 </li> 1058 <li> 1059 <input type="radio" name="q_1068214_raise_money" value="I'm not sure -- I haven't done this before but I'll do my best" id="q_1068214_1908712" /> 1060 1061 <label for="q_1068214_1908712" value="1908712"> 1062 I'm not sure -- I haven't done this before but I'll do my best </label> 1063 </li> 1064 <li> 1065 <input type="radio" name="q_1068214_raise_money" value="Not really, I hate asking people for money" id="q_1068214_1908713" /> 1066 1067 <label for="q_1068214_1908713" value="1908713"> 1068 Not really, I hate asking people for money </label> 1069 </li> 1070 </ul> 1071 </div> 1072 </div> 1073 </div> 1074 1075 <div class="PDF_questionDivide" id="pd-divider-25"></div> 1076 1077 <div class="PDF_question" id="pd-question-26"> 1078 <div class="qNumber"> 1079 Q.26 1080 </div> 1081 1082 <div class="qContent"> 1083 <div class="qText"> 1084 If there are businesses already interested in sponsoring, list them here. 1085 </div> 1086 1087 <div class="PDF_QT100"> 1088 <input value="" maxlength="500" name="q_1068220_interested_sponsors" class="large" type="text" title="If there are businesses already interested in spons…" /> 1089 </div> 1090 </div> 1091 </div> 1092 1093 <div class="PDF_questionDivide" id="pd-divider-26"></div> 1094 1095 <div class="PDF_question" id="pd-question-27"> 1096 <div class="qNumber"> 1097 Q.27 1098 </div> 1099 1100 <div class="qContent"> 1101 <div class="qText"> 1102 Do you know local people who would make good presenters/speakers? 1103 </div> 1104 1105 <div class="PDF_QT400"> 1106 <ul> 1107 <li> 1108 <input type="radio" name="q_1046009_good_presenters" value="Yes, I know lots of local WordPress users/developers" id="q_1046009_1865453" /> 1109 1110 <label for="q_1046009_1865453" value="1865453"> 1111 Yes, I know lots of local WordPress users/developers </label> 1112 </li> 1113 <li> 1114 <input type="radio" name="q_1046009_good_presenters" value="Yes, I know a couple of people who would be qualified" id="q_1046009_1865454" /> 1115 1116 <label for="q_1046009_1865454" value="1865454"> 1117 Yes, I know a couple of people who would be qualified </label> 1118 </li> 1119 <li> 1120 <input type="radio" name="q_1046009_good_presenters" value="No, I don't know anyone local who could speak" id="q_1046009_1865455" /> 1121 1122 <label for="q_1046009_1865455" value="1865455"> 1123 No, I don't know anyone local who could speak </label> 1124 </li> 1125 </ul> 1126 </div> 1127 </div> 1128 </div> 1129 1130 <div class="PDF_questionDivide" id="pd-divider-27"></div> 1131 1132 <div class="PDF_question" id="pd-question-28"> 1133 <div class="qNumber"> 1134 Q.28 1135 </div> 1136 1137 <div class="qContent"> 1138 <div class="qText"> 1139 Please enter the names of the people you have in mind, and describe them in a few words. 1140 </div> 1141 1142 <div class="PDF_QT200"> 1143 <textarea name="q_1046021_presenter_names" class="small" rows="10" cols="40" title="Please enter the names of the people you have in mi…"></textarea> 1144 </div> 1145 </div> 1146 </div> 1147 1148 <div class="PDF_questionDivide" id="pd-divider-28"></div> 1149 1150 <div class="PDF_question" id="pd-question-29"> 1151 <div class="qNumber"> 1152 Q.29 1153 </div> 1154 1155 <div class="qContent"> 1156 <div class="qText"> 1157 Do you have any connections to potential venue donations (colleges, offices, etc)? 1158 </div> 1159 1160 <div class="PDF_QT400"> 1161 <ul> 1162 <li> 1163 <input type="radio" name="q_1068197_venue_connections" value="Yes, I've been talking to people already" id="q_1068197_1908695" /> 1164 1165 <label for="q_1068197_1908695" value="1908695"> 1166 Yes, I've been talking to people already </label> 1167 </li> 1168 <li> 1169 <input type="radio" name="q_1068197_venue_connections" value="No, but I have some leads" id="q_1068197_1908696" /> 1170 1171 <label for="q_1068197_1908696" value="1908696"> 1172 No, but I have some leads </label> 1173 </li> 1174 <li> 1175 <input type="radio" name="q_1068197_venue_connections" value="No, I'll be looking for a venue from scratch" id="q_1068197_1908697" /> 1176 1177 <label for="q_1068197_1908697" value="1908697"> 1178 No, I'll be looking for a venue from scratch </label> 1179 </li> 1180 </ul> 1181 </div> 1182 </div> 1183 </div> 1184 1185 <div class="PDF_questionDivide" id="pd-divider-29"></div> 1186 1187 <div class="PDF_question" id="pd-question-30"> 1188 <div class="qNumber"> 1189 Q.30 1190 </div> 1191 1192 <div class="qContent"> 1193 <div class="qText"> 1194 What possible venues are you considering? 1195 </div> 1196 1197 <div class="PDF_QT200"> 1198 <textarea name="q_1068212_venues_considering" class="small" rows="10" cols="40" title="What possible venues are you considering?"></textarea> 1199 </div> 1200 </div> 1201 </div> 1202 1203 <div class="PDF_questionDivide" id="pd-divider-30"></div> 1204 1205 <div class="PDF_question" id="pd-question-32"> 1206 <div class="qNumber"> 1207 Q.32 1208 </div> 1209 1210 <div class="qContent"> 1211 <div class="qText"> 1212 Anything else you want us to know while we're looking over your application? 1213 </div> 1214 1215 <div class="PDF_QT200"> 1216 <textarea name="q_1079098_anything_else" class="large" rows="10" cols="40" title="Anything else you want us to know while we're looki…"></textarea> 1217 </div> 1218 </div> 1219 </div> 1220 1221 <div class="PDF_questionDivide" id="pd-divider-32"></div> 1222 1223 <div class="PDF_question" id="pd-question-10003"> 1224 <div class="qContent"> 1225 <div class="PDF_QT1900"> 1226 <h2>Bonus Question!</h2> 1227 </div> 1228 </div> 1229 </div> 1230 1231 <div class="PDF_questionDivide" id="pd-divider-10003"></div> 1232 1233 <div class="PDF_question" id="pd-question-33"> 1234 <div class="qNumber"> 1235 Q.33 1236 </div> 1237 1238 <div class="qContent"> 1239 <div class="qText"> 1240 Which of these best describes you? 1241 </div> 1242 1243 <div class="PDF_QT400"> 1244 <ul> 1245 <li> 1246 <input type="radio" name="q_1079112_best_describes_you" value="Personal Blogger" id="q_1079112_1926766" /> 1247 1248 <label for="q_1079112_1926766" value="1926766"> 1249 Personal Blogger </label> 1250 </li> 1251 <li> 1252 <input type="radio" name="q_1079112_best_describes_you" value="Company Blogger" id="q_1079112_1926767" /> 1253 1254 <label for="q_1079112_1926767" value="1926767"> 1255 Company Blogger </label> 1256 </li> 1257 <li> 1258 <input type="radio" name="q_1079112_best_describes_you" value="Designer" id="q_1079112_1926768" /> 1259 1260 <label for="q_1079112_1926768" value="1926768"> 1261 Designer </label> 1262 </li> 1263 <li> 1264 <input type="radio" name="q_1079112_best_describes_you" value="Beginning Developer" id="q_1079112_1926769" /> 1265 1266 <label for="q_1079112_1926769" value="1926769"> 1267 Beginning Developer </label> 1268 </li> 1269 <li> 1270 <input type="radio" name="q_1079112_best_describes_you" value="Advanced Developer" id="q_1079112_1926770" /> 1271 1272 <label for="q_1079112_1926770" value="1926770"> 1273 Advanced Developer </label> 1274 </li> 1275 <li> 1276 <input type="radio" name="q_1079112_best_describes_you" value="Project Manager" id="q_1079112_1926771" /> 1277 1278 <label for="q_1079112_1926771" value="1926771"> 1279 Project Manager </label> 1280 </li> 1281 <li> 1282 <input type="radio" name="q_1079112_best_describes_you" value="System Administrator/IT Professional" id="q_1079112_1926772" /> 1283 1284 <label for="q_1079112_1926772" value="1926772"> 1285 System Administrator/IT Professional </label> 1286 </li> 1287 <li> 1288 <input type="radio" name="q_1079112_best_describes_you" value="Sales/Marketing/PR" id="q_1079112_1926773" /> 1289 1290 <label for="q_1079112_1926773" value="1926773"> 1291 Sales/Marketing/PR </label> 1292 </li> 1293 <li> 1294 <input type="radio" name="q_1079112_best_describes_you" value="Business Owner" id="q_1079112_1926774" /> 1295 1296 <label for="q_1079112_1926774" value="1926774"> 1297 Business Owner </label> 1298 </li> 1299 <li> 1300 <input type="radio" name="q_1079112_best_describes_you" value="WordPress Fan" id="q_1079112_1926775" /> 1301 1302 <label for="q_1079112_1926775" value="1926775"> 1303 WordPress Fan </label> 1304 </li> 1305 <li> 1306 <input type="radio" name="q_1079112_best_describes_you" id="q_1079112_other" value="other" /> 1307 1308 <label for="q_1079112_other"> 1309 Other: 1310 </label> 1311 1312 <input type="text" class="other" name="q_1079112_best_describes_you_other" value="" style="width: 75%" /> 1313 </li> 1314 </ul> 1315 </div> 1316 </div> 1317 </div> 1318 1319 <div class="PDF_questionDivide" id="pd-divider-33"></div> 1320 1321 <div class="PDF_question"> 1322 <div class="button"> 1323 <input type="submit" name="submit-application" value="Submit Application" /> 1324 </div> 1325 </div> 1326 1327 </div> <!-- PDF.pageInner --> 1328 </div> <!-- PDF.pageOuter --> 1329 1330 </form> 6 7 /** 8 * Renders the application form for meetup. Renders shortcode meetup-organizer-application 9 * Modified from https://wordcampcentral.polldaddy.com/s/wordcamp-organizer-application 10 * 11 * @param array $countries 12 */ 13 function render_wordcamp_application_form( $countries ) { 14 ?> 15 16 <form id="wordcamp-application" method="post"> 17 <div class="PDF_pageOuter"> 18 <div class="PDF_pageInner"> 19 <div class="PDF_question" id="pd-question-10000"> 20 <div class="qContent"> 21 <div class="PDF_QT1900"> 22 <h2>Part I: About You</h2> 23 </div> 24 </div> 25 </div> 26 27 <div class="PDF_questionDivide" id="pd-divider-10000"></div> 28 29 <div class="PDF_question" id="pd-question-1"> 30 <div class="qNumber"> 31 Q.1 32 </div> 33 34 <div class="qContent"> 35 <div class="qText"> 36 Please enter your name. 37 <span class="PDF_mand">*</span> 38 </div> 39 40 <div class="PDF_QT800"> 41 <div> 42 <label for="q_1079074_first_name">First Name</label> 43 <br/> 44 <input type="text" class="firstName" maxlength="50" name="q_1079074_first_name" 45 id="q_1079074_first_name" value="" required/> 46 </div> 47 48 <div> 49 <label for="q_1079074_last_name">Last Name</label> 50 <br/> 51 <input type="text" class="lastName" maxlength="50" name="q_1079074_last_name" 52 id="q_1079074_last_name" value="" required/> 53 </div> 54 </div> 55 </div> 56 </div> 57 58 <div class="PDF_questionDivide" id="pd-divider-1"></div> 59 60 <div class="PDF_question" id="pd-question-2"> 61 <div class="qNumber"> 62 Q.2 63 </div> 64 65 <div class="qContent"> 66 <div class="qText"> 67 Please enter your email address. 68 <span class="PDF_mand">*</span> 69 </div> 70 71 <div class="PDF_QT1400"> 72 <label for="q_1079059_email">(e.g. john@example.com)</label> 73 <br/> 74 <input type="email" maxlength="100" name="q_1079059_email" id="q_1079059_email" value="" 75 class="survey-email required" autocomplete="off" required/> 76 </div> 77 </div> 78 </div> 79 80 <div class="PDF_questionDivide" id="pd-divider-2"></div> 81 82 <div class="PDF_question" id="pd-question-31"> 83 <div class="qNumber"> 84 Q.31 85 </div> 86 87 <div class="qContent"> 88 <div class="qText"> 89 What is your wordpress.org username? 90 <span class="PDF_mand">*</span> 91 </div> 92 93 <div class="qNote"> 94 <p>(This is the username you'd use to log in to http://wordpress.org/support/)</p> 95 </div> 96 97 <div class="PDF_QT100"> 98 <input value="" maxlength="500" name="q_4236565_wporg_username" class="large required" 99 type="text" title="What is your wordpress.org username?" required/> 100 </div> 101 </div> 102 </div> 103 104 <div class="PDF_questionDivide" id="pd-divider-31"></div> 105 106 <div class="PDF_question" id="pd-question-34"> 107 <div class="qNumber"> 108 Q.34 109 </div> 110 111 <div class="qContent"> 112 <div class="qText"> 113 What is your username on <a href="https://chat.wordpress.org" target="_blank">WordPress' 114 Slack workspace</a>? 115 </div> 116 117 <div class="PDF_QT100"> 118 <input value="" maxlength="500" name="q_4236565_slack_username" class="large" type="text" 119 title="What is your Slack username?"/> 120 </div> 121 </div> 122 </div> 123 124 <div class="PDF_questionDivide"></div> 125 126 <div class="PDF_question"> 127 <div class="qContent"> 128 <div class="qText"> 129 Where can we find you online? 130 </div> 131 132 <div class="PDF_QT100"> 133 <input value="" maxlength="500" name="where_find_online" class="large" type="text" 134 title="Where can we find you online?"/> 135 </div> 136 </div> 137 </div> 138 139 <div class="PDF_questionDivide" id="pd-divider-34"></div> 140 141 <div class="PDF_question" id="pd-question-3"> 142 <div class="qNumber"> 143 Q.3 144 </div> 145 146 <div class="qContent"> 147 <div class="qText"> 148 Please enter your mailing address (at least your city/state or city/country). 149 </div> 150 151 <div class="PDF_QT900"> 152 <div> 153 <label for="q_1079060_add1">Address Line 1</label> 154 <br/> 155 <input type="text" maxlength="100" class="a" name="q_1079060_add1" id="q_1079060_add1" 156 value=""/> 157 </div> 158 159 <div> 160 <label for="q_1079060_add2">Address Line 2</label> 161 <br/> 162 <input type="text" maxlength="100" class="b" name="q_1079060_add2" id="q_1079060_add2" 163 value=""/> 164 </div> 165 166 <div> 167 <label for="q_1079060_city">City</label> 168 <br/> 169 <input type="text" maxlength="50" class="c" name="q_1079060_city" id="q_1079060_city" 170 value=""/> 171 </div> 172 173 <div> 174 <label for="q_1079060_state">State</label> 175 <br/> 176 <input type="text" maxlength="50" class="d" name="q_1079060_state" id="q_1079060_state" 177 value=""/> 178 </div> 179 180 <div> 181 <label for="q_1079060_zip">Zip Code</label> 182 <br/> 183 <input type="text" maxlength="20" class="e" name="q_1079060_zip" id="q_1079060_zip" 184 value=""/> 185 </div> 186 187 <div> 188 <label for="q_1079060_country">Country</label> 189 <br/> 190 191 <select name="q_1079060_country" id="q_1079060_country"> 192 <option value=""></option> 193 194 <?php foreach ( $countries as $country ) : ?> 195 <option value="<?php echo esc_attr( $country['alpha2'] ); ?>"> 196 <?php echo esc_html( $country['name'] ); ?> 197 </option> 198 <?php endforeach; ?> 199 </select> 200 </div> 201 </div> 202 </div> 203 </div> 204 205 <div class="PDF_questionDivide" id="pd-divider-3"></div> 206 207 <div class="PDF_question" id="pd-question-4"> 208 <div class="qNumber"> 209 Q.4 210 </div> 211 212 <div class="qContent"> 213 <div class="qText"> 214 How long have you been using WordPress? 215 </div> 216 217 <div class="PDF_QT400"> 218 <ul> 219 <li> 220 <input type="radio" name="q_1045947_years_using_wp" value="7+ years" 221 id="q_1045947_1865361"/> 222 223 <label for="q_1045947_1865361" value="1865361"> 224 7+ years </label> 225 </li> 226 <li> 227 <input type="radio" name="q_1045947_years_using_wp" value="6 years" 228 id="q_1045947_1865362"/> 229 230 <label for="q_1045947_1865362" value="1865362"> 231 6 years </label> 232 </li> 233 <li> 234 <input type="radio" name="q_1045947_years_using_wp" value="5 years" 235 id="q_1045947_1865363"/> 236 237 <label for="q_1045947_1865363" value="1865363"> 238 5 years </label> 239 </li> 240 <li> 241 <input type="radio" name="q_1045947_years_using_wp" value="4 years" 242 id="q_1045947_1865369"/> 243 244 <label for="q_1045947_1865369" value="1865369"> 245 4 years </label> 246 </li> 247 <li> 248 <input type="radio" name="q_1045947_years_using_wp" value="3 years" 249 id="q_1045947_1865370"/> 250 251 <label for="q_1045947_1865370" value="1865370"> 252 3 years </label> 253 </li> 254 <li> 255 <input type="radio" name="q_1045947_years_using_wp" value="2 years" 256 id="q_1045947_1865371"/> 257 258 <label for="q_1045947_1865371" value="1865371"> 259 2 years </label> 260 </li> 261 <li> 262 <input type="radio" name="q_1045947_years_using_wp" value="1 year" 263 id="q_1045947_1865372"/> 264 265 <label for="q_1045947_1865372" value="1865372"> 266 1 year </label> 267 </li> 268 <li> 269 <input type="radio" name="q_1045947_years_using_wp" value="less than a year" 270 id="q_1045947_1865373"/> 271 272 <label for="q_1045947_1865373" value="1865373"> 273 Less than a year </label> 274 </li> 275 <li> 276 <input type="radio" name="q_1045947_years_using_wp" 277 value="I don't use WordPress yet" id="q_1045947_1865374"/> 278 279 <label for="q_1045947_1865374" value="1865374"> 280 I don't use WordPress yet </label> 281 </li> 282 </ul> 283 </div> 284 </div> 285 </div> 286 287 <div class="PDF_questionDivide" id="pd-divider-4"></div> 288 289 <div class="PDF_question" id="pd-question-5"> 290 <div class="qNumber"> 291 Q.5 292 </div> 293 294 <div class="qContent"> 295 <div class="qText"> 296 How have you been involved in the WordPress community so far? 297 </div> 298 299 <div class="PDF_QT400"> 300 <ul> 301 <li> 302 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908777" 303 value="I use WordPress for my website(s)"/> 304 305 <label for="q_1068246_1908777">I use WordPress for my website(s)</label> 306 </li> 307 <li> 308 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908778" 309 value="I help other people use WordPress for their websites"/> 310 311 <label for="q_1068246_1908778">I help other people use WordPress for their 312 websites</label> 313 </li> 314 <li> 315 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908779" 316 value="I make plugins"/> 317 318 <label for="q_1068246_1908779">I make plugins</label> 319 </li> 320 <li> 321 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908831" 322 value="I make themes"/> 323 324 <label for="q_1068246_1908831">I make themes</label> 325 </li> 326 <li> 327 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908832" 328 value="I contribute to the WordPress core codebase"/> 329 330 <label for="q_1068246_1908832">I contribute to the WordPress core codebase</label> 331 </li> 332 <li> 333 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908833" 334 value="I volunteer in the support forums at wordpress.org"/> 335 336 <label for="q_1068246_1908833">I volunteer in the support forums at 337 wordpress.org</label> 338 </li> 339 <li> 340 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908834" 341 value="I contribute to the WordPress core UI group"/> 342 343 <label for="q_1068246_1908834">I contribute to the WordPress core UI group</label> 344 </li> 345 <li> 346 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908835" 347 value="I'm involved with local WordPress meetups"/> 348 349 <label for="q_1068246_1908835">I'm involved with local WordPress meetups</label> 350 </li> 351 <li> 352 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1908836" 353 value="I've been involved with previous WordCamps"/> 354 355 <label for="q_1068246_1908836">I've been involved with previous WordCamps</label> 356 </li> 357 <li> 358 <input type="checkbox" name="q_1068246_ways_involved[]" id="q_1068246_1926765" 359 value="WordPress helps me make a living"/> 360 361 <label for="q_1068246_1926765">WordPress helps me make a living</label> 362 </li> 363 364 <li> 365 <label for="q_1068246_other">Other:</label> 366 367 <input type="text" class="other" name="q_1068246_ways_involved_other" 368 id="q_1068246_other" value="" style="width: 75%"/> 369 </li> 370 </ul> 371 </div> 372 </div> 373 </div> 374 375 <div class="PDF_questionDivide" id="pd-divider-5"></div> 376 377 <div class="PDF_question" id="pd-question-6"> 378 <div class="qNumber"> 379 Q.6 380 </div> 381 382 <div class="qContent"> 383 <div class="qText"> 384 Have you ever attended a WordCamp before? 385 </div> 386 387 <div class="PDF_QT400"> 388 <ul> 389 <li> 390 <input type="radio" name="q_1046032_attended_camp_before" value="Yes, more than one" 391 id="q_1046032_1865479"/> 392 393 <label for="q_1046032_1865479" value="1865479"> 394 Yes, more than one </label> 395 </li> 396 <li> 397 <input type="radio" name="q_1046032_attended_camp_before" 398 value="Yes, I've been to one" id="q_1046032_1865480"/> 399 400 <label for="q_1046032_1865480" value="1865480"> 401 Yes, I've been to one </label> 402 </li> 403 <li> 404 <input type="radio" name="q_1046032_attended_camp_before" 405 value="No, I haven't been to a WordCamp yet" id="q_1046032_1865481"/> 406 407 <label for="q_1046032_1865481" value="1865481"> 408 No, I haven't been to a WordCamp yet </label> 409 </li> 410 </ul> 411 412 </div> 413 </div> 414 </div> 415 416 <div class="PDF_questionDivide" id="pd-divider-6"></div> 417 418 <div class="PDF_question" id="pd-question-7"> 419 <div class="qNumber"> 420 Q.7 421 </div> 422 423 <div class="qContent"> 424 <div class="qText"> 425 What WordCamps have you been to? Please list one per line in this format: City, Year (ex. 426 San Francisco, 2010) 427 </div> 428 429 <div class="PDF_QT200"> 430 <textarea name="q_1046033_camps_been_to" class="small" rows="10" cols="40" 431 title="What WordCamps have you been to? Please list one pe…"></textarea> 432 </div> 433 </div> 434 </div> 435 436 <div class="PDF_questionDivide" id="pd-divider-7"></div> 437 438 <div class="PDF_question" id="pd-question-8"> 439 <div class="qNumber"> 440 Q.8 441 </div> 442 443 <div class="qContent"> 444 <div class="qText"> 445 What do you hope to accomplish by organizing a WordCamp? 446 </div> 447 448 <div class="PDF_QT400"> 449 <ul> 450 <li> 451 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908730" 452 value="Grow my local WordPress community"/> 453 454 <label for="q_1068223_1908730">Grow my local WordPress community</label> 455 </li> 456 <li> 457 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908731" 458 value="Introduce new people to WordPress/teach new users"/> 459 460 <label for="q_1068223_1908731">Introduce new people to WordPress/teach new 461 users</label> 462 </li> 463 <li> 464 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908732" 465 value="Find collaborators for WordPress projects"/> 466 467 <label for="q_1068223_1908732">Find collaborators for WordPress projects</label> 468 </li> 469 <li> 470 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908771" 471 value="Raise my visibility in the community"/> 472 473 <label for="q_1068223_1908771">Raise my visibility in the community</label> 474 </li> 475 <li> 476 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908772" 477 value="Make connections with visiting speakers (like Matt Mullenweg)"/> 478 479 <label for="q_1068223_1908772">Make connections with visiting speakers (like Matt 480 Mullenweg)</label> 481 </li> 482 <li> 483 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908773" 484 value="Make money from surplus ticket sales/sponsorships"/> 485 486 <label for="q_1068223_1908773">Make money from surplus ticket 487 sales/sponsorships</label> 488 </li> 489 <li> 490 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908774" 491 value="Have fun/throw a good party"/> 492 493 <label for="q_1068223_1908774">Have fun/throw a good party</label> 494 </li> 495 <li> 496 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908775" 497 value="Be part of the zeitgeist, as WordCamps are very popular right now"/> 498 499 <label for="q_1068223_1908775">Be part of the zeitgeist, as WordCamps are very 500 popular right now</label> 501 </li> 502 <li> 503 <input type="checkbox" name="q_1068223_hope_to_accomplish[]" id="q_1068223_1908776" 504 value="Inspire people to do more with WordPress"/> 505 506 <label for="q_1068223_1908776">Inspire people to do more with WordPress</label> 507 </li> 508 509 <li> 510 <label for="q_1068223_other">Other:</label> 511 512 <input type="text" class="other" name="q_1068223_hope_to_accomplish_other" 513 id="q_1068223_other" value="" style="width: 75%"/> 514 </li> 515 </ul> 516 </div> 517 </div> 518 </div> 519 520 <div class="PDF_questionDivide" id="pd-divider-8"></div> 521 522 <div class="PDF_question" id="pd-question-10001"> 523 <div class="qContent"> 524 <div class="PDF_QT1900"> 525 <h2>Part II: About Your Local Community</h2> 526 </div> 527 </div> 528 </div> 529 530 <div class="PDF_questionDivide" id="pd-divider-10001"></div> 531 532 <div class="PDF_question" id="pd-question-9"> 533 <div class="qNumber"> 534 Q.9 535 </div> 536 537 <div class="qContent"> 538 <div class="qText"> 539 Is there an active WordPress meetup in your area? 540 </div> 541 542 <div class="PDF_QT400"> 543 <ul> 544 <li> 545 <input type="radio" name="q_1045950_active_meetup" value="Yes" 546 id="q_1045950_1865375"/> 547 548 <label for="q_1045950_1865375" value="1865375"> 549 Yes </label> 550 </li> 551 <li> 552 <input type="radio" name="q_1045950_active_meetup" value="No" 553 id="q_1045950_1865376"/> 554 555 <label for="q_1045950_1865376" value="1865376"> 556 No </label> 557 </li> 558 <li> 559 <input type="radio" name="q_1045950_active_meetup" value="I don't know" 560 id="q_1045950_1865377"/> 561 562 <label for="q_1045950_1865377" value="1865377"> 563 I don't know </label> 564 </li> 565 </ul> 566 </div> 567 </div> 568 </div> 569 570 <div class="PDF_questionDivide" id="pd-divider-9"></div> 571 572 <div class="PDF_question" id="pd-question-10"> 573 <div class="qNumber"> 574 Q.10 575 </div> 576 577 <div class="qContent"> 578 <div class="qText"> 579 What is your role in the meetup group? 580 </div> 581 582 <div class="PDF_QT400"> 583 <ul> 584 <li> 585 <input type="radio" name="q_1045953_role_in_meetup" value="I am the organizer" 586 id="q_1045953_1865378"/> 587 588 <label for="q_1045953_1865378" value="1865378"> 589 I am the organizer </label> 590 </li> 591 <li> 592 <input type="radio" name="q_1045953_role_in_meetup" 593 value="I am a regular attendee and presenter" id="q_1045953_1865379"/> 594 595 <label for="q_1045953_1865379" value="1865379"> 596 I am a regular attendee and presenter </label> 597 </li> 598 <li> 599 <input type="radio" name="q_1045953_role_in_meetup" 600 value="I attend regularly but don't present" id="q_1045953_1865380"/> 601 602 <label for="q_1045953_1865380" value="1865380"> 603 I attend regularly but don't present </label> 604 </li> 605 <li> 606 <input type="radio" name="q_1045953_role_in_meetup" value="I attend sometimes" 607 id="q_1045953_1865381"/> 608 609 <label for="q_1045953_1865381" value="1865381"> 610 I attend sometimes </label> 611 </li> 612 <li> 613 <input type="radio" name="q_1045953_role_in_meetup" value="I attend rarely" 614 id="q_1045953_1865382"/> 615 616 <label for="q_1045953_1865382" value="1865382"> 617 I attend rarely </label> 618 </li> 619 <li> 620 <input type="radio" name="q_1045953_role_in_meetup" 621 value="I do not attend the meetups" id="q_1045953_1865383"/> 622 623 <label for="q_1045953_1865383" value="1865383"> 624 I do not attend the meetups </label> 625 </li> 626 </ul> 627 </div> 628 </div> 629 </div> 630 631 <div class="PDF_questionDivide" id="pd-divider-10"></div> 632 633 <div class="PDF_question" id="pd-question-11"> 634 <div class="qNumber"> 635 Q.11 636 </div> 637 638 <div class="qContent"> 639 <div class="qText"> 640 What is the URL for the meetup group's website? 641 </div> 642 643 <div class="PDF_QT100"> 644 <input value="" maxlength="500" name="q_1045972_meetup_url" class="large" type="url" 645 title="What is the URL for the meetup group's website?"/> 646 </div> 647 </div> 648 </div> 649 650 <div class="PDF_questionDivide" id="pd-divider-11"></div> 651 652 <div class="PDF_question" id="pd-question-12"> 653 <div class="qNumber"> 654 Q.12 655 </div> 656 657 <div class="qContent"> 658 <div class="qText"> 659 About how many members are there? 660 </div> 661 662 <div class="PDF_QT400"> 663 <ul> 664 <li> 665 <input type="radio" name="q_1045967_meetup_members" value="500+" 666 id="q_1045967_1865388"/> 667 668 <label for="q_1045967_1865388" value="1865388"> 669 500+ </label> 670 </li> 671 <li> 672 <input type="radio" name="q_1045967_meetup_members" value="300-499" 673 id="q_1045967_1865389"/> 674 675 <label for="q_1045967_1865389" value="1865389"> 676 300-499 </label> 677 </li> 678 <li> 679 <input type="radio" name="q_1045967_meetup_members" value="100-299" 680 id="q_1045967_1865390"/> 681 682 <label for="q_1045967_1865390" value="1865390"> 683 100-299 </label> 684 </li> 685 <li> 686 <input type="radio" name="q_1045967_meetup_members" value="50-99" 687 id="q_1045967_1865391"/> 688 689 <label for="q_1045967_1865391" value="1865391"> 690 50-99 </label> 691 </li> 692 <li> 693 <input type="radio" name="q_1045967_meetup_members" value="26-49" 694 id="q_1045967_1865392"/> 695 696 <label for="q_1045967_1865392" value="1865392"> 697 26-49 </label> 698 </li> 699 <li> 700 <input type="radio" name="q_1045967_meetup_members" value="1-25" 701 id="q_1045967_1865393"/> 702 703 <label for="q_1045967_1865393" value="1865393"> 704 1-25 </label> 705 </li> 706 <li> 707 <input type="radio" name="q_1045967_meetup_members" value="I don't know" 708 id="q_1045967_1926755"/> 709 710 <label for="q_1045967_1926755" value="1926755"> 711 I don't know </label> 712 </li> 713 </ul> 714 </div> 715 </div> 716 </div> 717 718 <div class="PDF_questionDivide" id="pd-divider-12"></div> 719 720 <div class="PDF_question" id="pd-question-13"> 721 <div class="qNumber"> 722 Q.13 723 </div> 724 725 <div class="qContent"> 726 <div class="qText"> 727 How often does the group have meetups? 728 </div> 729 730 <div class="PDF_QT400"> 731 <ul> 732 <li> 733 <input type="radio" name="q_1045956_how_often_meetup" value="Once per month" 734 id="q_1045956_1865384"/> 735 736 <label for="q_1045956_1865384" value="1865384"> 737 Once per month </label> 738 </li> 739 <li> 740 <input type="radio" name="q_1045956_how_often_meetup" value="Several per month" 741 id="q_1045956_1865385"/> 742 743 <label for="q_1045956_1865385" value="1865385"> 744 Several per month </label> 745 </li> 746 <li> 747 <input type="radio" name="q_1045956_how_often_meetup" 748 value="One every couple of months" id="q_1045956_1865386"/> 749 750 <label for="q_1045956_1865386" value="1865386"> 751 One every couple of months </label> 752 </li> 753 <li> 754 <input type="radio" name="q_1045956_how_often_meetup" 755 value="There's a group but it never meets" id="q_1045956_1865387"/> 756 757 <label for="q_1045956_1865387" value="1865387"> 758 There's a group but it never meets </label> 759 </li> 760 </ul> 761 </div> 762 </div> 763 </div> 764 765 <div class="PDF_questionDivide" id="pd-divider-13"></div> 766 767 <div class="PDF_question" id="pd-question-14"> 768 <div class="qNumber"> 769 Q.14 770 </div> 771 772 <div class="qContent"> 773 <div class="qText"> 774 About how many people usually attend the meetups? 775 </div> 776 777 <div class="PDF_QT400"> 778 <ul> 779 <li> 780 <input type="radio" name="q_1045971_how_many_attend" value="500+" 781 id="q_1045971_1865397"/> 782 783 <label for="q_1045971_1865397" value="1865397"> 784 500+ </label> 785 </li> 786 <li> 787 <input type="radio" name="q_1045971_how_many_attend" value="300-499" 788 id="q_1045971_1865398"/> 789 790 <label for="q_1045971_1865398" value="1865398"> 791 300-499 </label> 792 </li> 793 <li> 794 <input type="radio" name="q_1045971_how_many_attend" value="100-299" 795 id="q_1045971_1865399"/> 796 797 <label for="q_1045971_1865399" value="1865399"> 798 100-299 </label> 799 </li> 800 <li> 801 <input type="radio" name="q_1045971_how_many_attend" value="50-99" 802 id="q_1045971_1865400"/> 803 804 <label for="q_1045971_1865400" value="1865400"> 805 50-99 </label> 806 </li> 807 <li> 808 <input type="radio" name="q_1045971_how_many_attend" value="26-49" 809 id="q_1045971_1865401"/> 810 811 <label for="q_1045971_1865401" value="1865401"> 812 26-49 </label> 813 </li> 814 <li> 815 <input type="radio" name="q_1045971_how_many_attend" value="1-25" 816 id="q_1045971_1865402"/> 817 818 <label for="q_1045971_1865402" value="1865402"> 819 1-25 </label> 820 </li> 821 </ul> 822 </div> 823 </div> 824 </div> 825 826 <div class="PDF_questionDivide" id="pd-divider-14"></div> 827 828 <div class="PDF_question" id="pd-question-15"> 829 <div class="qNumber"> 830 Q.15 831 </div> 832 833 <div class="qContent"> 834 <div class="qText"> 835 Have other community tech events (BarCamp, meetups, open source conferences) been successful 836 in your city? 837 </div> 838 839 <div class="PDF_QT400"> 840 <ul> 841 <li> 842 <input type="radio" name="q_1079086_other_tech_events" 843 value="Yes, and I've attended some of them" id="q_1079086_1926723"/> 844 845 <label for="q_1079086_1926723" value="1926723"> 846 Yes, and I've attended some of them </label> 847 </li> 848 <li> 849 <input type="radio" name="q_1079086_other_tech_events" 850 value="Yes, though I haven't attended any" id="q_1079086_1926724"/> 851 852 <label for="q_1079086_1926724" value="1926724"> 853 Yes, though I haven't attended any </label> 854 </li> 855 <li> 856 <input type="radio" name="q_1079086_other_tech_events" 857 value="No, we've had a few but they weren't very well-attended" 858 id="q_1079086_1926725"/> 859 860 <label for="q_1079086_1926725" value="1926725"> 861 No, we've had a few but they weren't very well-attended </label> 862 </li> 863 <li> 864 <input type="radio" name="q_1079086_other_tech_events" 865 value="We haven't had any community tech events yet" id="q_1079086_1926744"/> 866 867 <label for="q_1079086_1926744" value="1926744"> 868 We haven't had any community tech events yet </label> 869 </li> 870 <li> 871 <input type="radio" name="q_1079086_other_tech_events" 872 value="I am not sure what events have been held here before, or if they've been successful" 873 id="q_1079086_1926745"/> 874 875 <label for="q_1079086_1926745" value="1926745"> 876 I am not sure what events have been held here before, or if they've been 877 successful </label> 878 </li> 879 </ul> 880 </div> 881 </div> 882 </div> 883 884 <div class="PDF_questionDivide" id="pd-divider-15"></div> 885 886 <div class="PDF_question" id="pd-question-16"> 887 <div class="qNumber"> 888 Q.16 889 </div> 890 891 <div class="qContent"> 892 <div class="qText"> 893 List any community tech events that have/have not been successful in your city. 894 </div> 895 896 <div class="PDF_QT200"> 897 <textarea name="q_1079082_other_tech_events_success" class="small" rows="10" cols="40" 898 title="List any community tech events that have/have not b…"></textarea> 899 </div> 900 </div> 901 </div> 902 903 <div class="PDF_questionDivide" id="pd-divider-16"></div> 904 905 <div class="PDF_question" id="pd-question-10002"> 906 <div class="qContent"> 907 <div class="PDF_QT1900"> 908 <h2>Part III: About Your Potential WordCamp</h2> 909 </div> 910 </div> 911 </div> 912 913 <div class="PDF_questionDivide" id="pd-divider-10002"></div> 914 915 <div class="PDF_question" id="pd-question-17"> 916 <div class="qNumber"> 917 Q.17 918 </div> 919 920 <div class="qContent"> 921 <div class="qText"> 922 Enter the city, state/province, and country where you would like to organize a WordCamp. 923 <span class="PDF_mand">*</span> 924 </div> 925 926 <div class="PDF_QT100"> 927 <input value="" maxlength="500" name="q_1079103_wordcamp_location" class="large required" 928 type="text" title="Enter the city, state/province, and country where y…" 929 required/> 930 </div> 931 </div> 932 </div> 933 934 <div class="PDF_questionDivide" id="pd-divider-17"></div> 935 936 <div class="PDF_question" id="pd-question-18"> 937 <div class="qNumber"> 938 Q.18 939 </div> 940 941 <div class="qContent"> 942 <div class="qText"> 943 When do you want to have a WordCamp in your city? (month/year) 944 </div> 945 946 <div class="PDF_QT100"> 947 <input value="" maxlength="500" name="q_1046006_wordcamp_date" class="large" type="text" 948 title="When do you want to have a WordCamp in your city? (…"/> 949 </div> 950 </div> 951 </div> 952 953 <div class="PDF_questionDivide" id="pd-divider-18"></div> 954 955 <div class="PDF_question" id="pd-question-19"> 956 <div class="qNumber"> 957 Q.19 958 </div> 959 960 <div class="qContent"> 961 <div class="qText"> 962 How many people do you think would attend? 963 </div> 964 965 <div class="PDF_QT100"> 966 <input value="" maxlength="500" name="q_1046007_how_many_attendees" class="large" 967 type="text" title="How many people do you think would attend?"/> 968 </div> 969 </div> 970 </div> 971 972 <div class="PDF_questionDivide" id="pd-divider-19"></div> 973 974 <div class="PDF_question" id="pd-question-20"> 975 <div class="qNumber"> 976 Q.20 977 </div> 978 979 <div class="qContent"> 980 <div class="qText"> 981 Have you ever organized an event like this before? 982 </div> 983 984 <div class="PDF_QT400"> 985 <ul> 986 <li> 987 <input type="radio" name="q_1046038_organized_event_before" 988 value="Yes, I've planned events of similar size/scope" 989 id="q_1046038_1865485"/> 990 991 <label for="q_1046038_1865485" value="1865485"> 992 Yes, I've planned events of similar size/scope </label> 993 </li> 994 <li> 995 <input type="radio" name="q_1046038_organized_event_before" 996 value="I've organized similar types of events, but smaller" 997 id="q_1046038_1865486"/> 998 999 <label for="q_1046038_1865486" value="1865486"> 1000 I've organized similar types of events, but smaller </label> 1001 </li> 1002 <li> 1003 <input type="radio" name="q_1046038_organized_event_before" 1004 value="I've organized other events" id="q_1046038_1865487"/> 1005 1006 <label for="q_1046038_1865487" value="1865487"> 1007 I've organized other events </label> 1008 </li> 1009 <li> 1010 <input type="radio" name="q_1046038_organized_event_before" 1011 value="I've never organized an event before" id="q_1046038_1865495"/> 1012 1013 <label for="q_1046038_1865495" value="1865495"> 1014 I've never organized an event before </label> 1015 </li> 1016 </ul> 1017 </div> 1018 </div> 1019 </div> 1020 1021 <div class="PDF_questionDivide" id="pd-divider-20"></div> 1022 1023 <div class="PDF_question" id="pd-question-21"> 1024 <div class="qNumber"> 1025 Q.21 1026 </div> 1027 1028 <div class="qContent"> 1029 <div class="qText"> 1030 Please give a brief description of the events you've been involved in organizing and 1031 what your role was. 1032 </div> 1033 1034 <div class="PDF_QT200"> 1035 <textarea name="q_1046099_describe_events" class="small" rows="10" cols="40" 1036 title="Please give a brief description of the events you'v…"></textarea> 1037 </div> 1038 </div> 1039 </div> 1040 1041 <div class="PDF_questionDivide" id="pd-divider-21"></div> 1042 1043 <div class="PDF_question" id="pd-question-22"> 1044 <div class="qNumber"> 1045 Q.22 1046 </div> 1047 1048 <div class="qContent"> 1049 <div class="qText"> 1050 Do you have at least 2 co-organizers? 1051 </div> 1052 1053 <div class="PDF_QT400"> 1054 <ul> 1055 <li> 1056 <input type="radio" name="q_1046101_have_co_organizers" 1057 value="Yes, I have co-organizers already" id="q_1046101_1908677"/> 1058 1059 <label for="q_1046101_1908677" value="1908677"> 1060 Yes, I have co-organizers already </label> 1061 </li> 1062 <li> 1063 <input type="radio" name="q_1046101_have_co_organizers" 1064 value="Nope, but I know some people who might be interested" 1065 id="q_1046101_1865560"/> 1066 1067 <label for="q_1046101_1865560" value="1865560"> 1068 Nope, but I know some people who might be interested </label> 1069 </li> 1070 <li> 1071 <input type="radio" name="q_1046101_have_co_organizers" 1072 value="Nope, I probably need help to find co-organizers" 1073 id="q_1046101_1865561"/> 1074 1075 <label for="q_1046101_1865561" value="1865561"> 1076 Nope, I probably need help to find co-organizers </label> 1077 </li> 1078 <li> 1079 <input type="radio" name="q_1046101_have_co_organizers" 1080 value="Nope, I want to do it by myself" id="q_1046101_1865562"/> 1081 1082 <label for="q_1046101_1865562" value="1865562"> 1083 Nope, I want to do it by myself </label> 1084 </li> 1085 </ul> 1086 </div> 1087 </div> 1088 </div> 1089 1090 <div class="PDF_questionDivide" id="pd-divider-22"></div> 1091 1092 <div class="PDF_question" id="pd-question-23"> 1093 <div class="qNumber"> 1094 Q.23 1095 </div> 1096 1097 <div class="qContent"> 1098 <div class="qText"> 1099 What's your relationship to your co-organizers? 1100 </div> 1101 1102 <div class="PDF_QT400"> 1103 <ul> 1104 <li> 1105 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" 1106 id="q_1068188_1908678" value="We work for the same company"/> 1107 1108 <label for="q_1068188_1908678">We work for the same company</label> 1109 </li> 1110 <li> 1111 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" 1112 id="q_1068188_1908679" value="We're friends"/> 1113 1114 <label for="q_1068188_1908679">We're friends</label> 1115 </li> 1116 <li> 1117 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" 1118 id="q_1068188_1908680" value="We've collaborated on projects before"/> 1119 1120 <label for="q_1068188_1908680">We've collaborated on projects before</label> 1121 </li> 1122 <li> 1123 <input type="checkbox" name="q_1068188_relationship_co_organizers[]" 1124 id="q_1068188_1908689" 1125 value="We met through the meetup group/other tech event"/> 1126 1127 <label for="q_1068188_1908689">We met through the meetup group/other tech 1128 event</label> 1129 </li> 1130 <li> 1131 <label for="q_1068188_other">Other:</label> 1132 1133 <input type="text" class="other" name="q_1068188_relationship_co_organizers_other" 1134 id="q_1068188_other" value="" style="width: 75%"/> 1135 </li> 1136 </ul> 1137 </div> 1138 </div> 1139 </div> 1140 1141 <div class="PDF_questionDivide" id="pd-divider-23"></div> 1142 1143 <div class="PDF_question" id="pd-question-24"> 1144 <div class="qNumber"> 1145 Q.24 1146 </div> 1147 1148 <div class="qContent"> 1149 <div class="qText"> 1150 Please enter the names and email addresses of your co-organizers here. 1151 </div> 1152 1153 <div class="PDF_QT200"> 1154 <textarea name="q_1068187_co_organizer_contact_info" class="small" rows="10" cols="40" 1155 title="Please enter the names and email addresses of your …"></textarea> 1156 </div> 1157 </div> 1158 </div> 1159 1160 <div class="PDF_questionDivide" id="pd-divider-24"></div> 1161 1162 <div class="PDF_question" id="pd-question-25"> 1163 <div class="qNumber"> 1164 Q.25 1165 </div> 1166 1167 <div class="qContent"> 1168 <div class="qText"> 1169 Are you confident you can raise money from local sponsors to cover the event costs? 1170 </div> 1171 1172 <div class="PDF_QT400"> 1173 <ul> 1174 <li> 1175 <input type="radio" name="q_1068214_raise_money" 1176 value="Yes, I'm cool with the fundraising" id="q_1068214_1908711"/> 1177 1178 <label for="q_1068214_1908711" value="1908711"> 1179 Yes, I'm cool with the fundraising </label> 1180 </li> 1181 <li> 1182 <input type="radio" name="q_1068214_raise_money" 1183 value="I'm not sure -- I haven't done this before but I'll do my best" 1184 id="q_1068214_1908712"/> 1185 1186 <label for="q_1068214_1908712" value="1908712"> 1187 I'm not sure -- I haven't done this before but I'll do my best </label> 1188 </li> 1189 <li> 1190 <input type="radio" name="q_1068214_raise_money" 1191 value="Not really, I hate asking people for money" id="q_1068214_1908713"/> 1192 1193 <label for="q_1068214_1908713" value="1908713"> 1194 Not really, I hate asking people for money </label> 1195 </li> 1196 </ul> 1197 </div> 1198 </div> 1199 </div> 1200 1201 <div class="PDF_questionDivide" id="pd-divider-25"></div> 1202 1203 <div class="PDF_question" id="pd-question-26"> 1204 <div class="qNumber"> 1205 Q.26 1206 </div> 1207 1208 <div class="qContent"> 1209 <div class="qText"> 1210 If there are businesses already interested in sponsoring, list them here. 1211 </div> 1212 1213 <div class="PDF_QT100"> 1214 <input value="" maxlength="500" name="q_1068220_interested_sponsors" class="large" 1215 type="text" title="If there are businesses already interested in spons…"/> 1216 </div> 1217 </div> 1218 </div> 1219 1220 <div class="PDF_questionDivide" id="pd-divider-26"></div> 1221 1222 <div class="PDF_question" id="pd-question-27"> 1223 <div class="qNumber"> 1224 Q.27 1225 </div> 1226 1227 <div class="qContent"> 1228 <div class="qText"> 1229 Do you know local people who would make good presenters/speakers? 1230 </div> 1231 1232 <div class="PDF_QT400"> 1233 <ul> 1234 <li> 1235 <input type="radio" name="q_1046009_good_presenters" 1236 value="Yes, I know lots of local WordPress users/developers" 1237 id="q_1046009_1865453"/> 1238 1239 <label for="q_1046009_1865453" value="1865453"> 1240 Yes, I know lots of local WordPress users/developers </label> 1241 </li> 1242 <li> 1243 <input type="radio" name="q_1046009_good_presenters" 1244 value="Yes, I know a couple of people who would be qualified" 1245 id="q_1046009_1865454"/> 1246 1247 <label for="q_1046009_1865454" value="1865454"> 1248 Yes, I know a couple of people who would be qualified </label> 1249 </li> 1250 <li> 1251 <input type="radio" name="q_1046009_good_presenters" 1252 value="No, I don't know anyone local who could speak" 1253 id="q_1046009_1865455"/> 1254 1255 <label for="q_1046009_1865455" value="1865455"> 1256 No, I don't know anyone local who could speak </label> 1257 </li> 1258 </ul> 1259 </div> 1260 </div> 1261 </div> 1262 1263 <div class="PDF_questionDivide" id="pd-divider-27"></div> 1264 1265 <div class="PDF_question" id="pd-question-28"> 1266 <div class="qNumber"> 1267 Q.28 1268 </div> 1269 1270 <div class="qContent"> 1271 <div class="qText"> 1272 Please enter the names of the people you have in mind, and describe them in a few words. 1273 </div> 1274 1275 <div class="PDF_QT200"> 1276 <textarea name="q_1046021_presenter_names" class="small" rows="10" cols="40" 1277 title="Please enter the names of the people you have in mi…"></textarea> 1278 </div> 1279 </div> 1280 </div> 1281 1282 <div class="PDF_questionDivide" id="pd-divider-28"></div> 1283 1284 <div class="PDF_question" id="pd-question-29"> 1285 <div class="qNumber"> 1286 Q.29 1287 </div> 1288 1289 <div class="qContent"> 1290 <div class="qText"> 1291 Do you have any connections to potential venue donations (colleges, offices, etc)? 1292 </div> 1293 1294 <div class="PDF_QT400"> 1295 <ul> 1296 <li> 1297 <input type="radio" name="q_1068197_venue_connections" 1298 value="Yes, I've been talking to people already" id="q_1068197_1908695"/> 1299 1300 <label for="q_1068197_1908695" value="1908695"> 1301 Yes, I've been talking to people already </label> 1302 </li> 1303 <li> 1304 <input type="radio" name="q_1068197_venue_connections" 1305 value="No, but I have some leads" id="q_1068197_1908696"/> 1306 1307 <label for="q_1068197_1908696" value="1908696"> 1308 No, but I have some leads </label> 1309 </li> 1310 <li> 1311 <input type="radio" name="q_1068197_venue_connections" 1312 value="No, I'll be looking for a venue from scratch" id="q_1068197_1908697"/> 1313 1314 <label for="q_1068197_1908697" value="1908697"> 1315 No, I'll be looking for a venue from scratch </label> 1316 </li> 1317 </ul> 1318 </div> 1319 </div> 1320 </div> 1321 1322 <div class="PDF_questionDivide" id="pd-divider-29"></div> 1323 1324 <div class="PDF_question" id="pd-question-30"> 1325 <div class="qNumber"> 1326 Q.30 1327 </div> 1328 1329 <div class="qContent"> 1330 <div class="qText"> 1331 What possible venues are you considering? 1332 </div> 1333 1334 <div class="PDF_QT200"> 1335 <textarea name="q_1068212_venues_considering" class="small" rows="10" cols="40" 1336 title="What possible venues are you considering?"></textarea> 1337 </div> 1338 </div> 1339 </div> 1340 1341 <div class="PDF_questionDivide" id="pd-divider-30"></div> 1342 1343 <div class="PDF_question" id="pd-question-32"> 1344 <div class="qNumber"> 1345 Q.32 1346 </div> 1347 1348 <div class="qContent"> 1349 <div class="qText"> 1350 Anything else you want us to know while we're looking over your application? 1351 </div> 1352 1353 <div class="PDF_QT200"> 1354 <textarea name="q_1079098_anything_else" class="large" rows="10" cols="40" 1355 title="Anything else you want us to know while we're looki…"></textarea> 1356 </div> 1357 </div> 1358 </div> 1359 1360 <div class="PDF_questionDivide" id="pd-divider-32"></div> 1361 1362 <div class="PDF_question" id="pd-question-10003"> 1363 <div class="qContent"> 1364 <div class="PDF_QT1900"> 1365 <h2>Bonus Question!</h2> 1366 </div> 1367 </div> 1368 </div> 1369 1370 <div class="PDF_questionDivide" id="pd-divider-10003"></div> 1371 1372 <div class="PDF_question" id="pd-question-33"> 1373 <div class="qNumber"> 1374 Q.33 1375 </div> 1376 1377 <div class="qContent"> 1378 <div class="qText"> 1379 Which of these best describes you? 1380 </div> 1381 1382 <div class="PDF_QT400"> 1383 <ul> 1384 <li> 1385 <input type="radio" name="q_1079112_best_describes_you" value="Personal Blogger" 1386 id="q_1079112_1926766"/> 1387 1388 <label for="q_1079112_1926766" value="1926766"> 1389 Personal Blogger </label> 1390 </li> 1391 <li> 1392 <input type="radio" name="q_1079112_best_describes_you" value="Company Blogger" 1393 id="q_1079112_1926767"/> 1394 1395 <label for="q_1079112_1926767" value="1926767"> 1396 Company Blogger </label> 1397 </li> 1398 <li> 1399 <input type="radio" name="q_1079112_best_describes_you" value="Designer" 1400 id="q_1079112_1926768"/> 1401 1402 <label for="q_1079112_1926768" value="1926768"> 1403 Designer </label> 1404 </li> 1405 <li> 1406 <input type="radio" name="q_1079112_best_describes_you" value="Beginning Developer" 1407 id="q_1079112_1926769"/> 1408 1409 <label for="q_1079112_1926769" value="1926769"> 1410 Beginning Developer </label> 1411 </li> 1412 <li> 1413 <input type="radio" name="q_1079112_best_describes_you" value="Advanced Developer" 1414 id="q_1079112_1926770"/> 1415 1416 <label for="q_1079112_1926770" value="1926770"> 1417 Advanced Developer </label> 1418 </li> 1419 <li> 1420 <input type="radio" name="q_1079112_best_describes_you" value="Project Manager" 1421 id="q_1079112_1926771"/> 1422 1423 <label for="q_1079112_1926771" value="1926771"> 1424 Project Manager </label> 1425 </li> 1426 <li> 1427 <input type="radio" name="q_1079112_best_describes_you" 1428 value="System Administrator/IT Professional" id="q_1079112_1926772"/> 1429 1430 <label for="q_1079112_1926772" value="1926772"> 1431 System Administrator/IT Professional </label> 1432 </li> 1433 <li> 1434 <input type="radio" name="q_1079112_best_describes_you" value="Sales/Marketing/PR" 1435 id="q_1079112_1926773"/> 1436 1437 <label for="q_1079112_1926773" value="1926773"> 1438 Sales/Marketing/PR </label> 1439 </li> 1440 <li> 1441 <input type="radio" name="q_1079112_best_describes_you" value="Business Owner" 1442 id="q_1079112_1926774"/> 1443 1444 <label for="q_1079112_1926774" value="1926774"> 1445 Business Owner </label> 1446 </li> 1447 <li> 1448 <input type="radio" name="q_1079112_best_describes_you" value="WordPress Fan" 1449 id="q_1079112_1926775"/> 1450 1451 <label for="q_1079112_1926775" value="1926775"> 1452 WordPress Fan </label> 1453 </li> 1454 <li> 1455 <input type="radio" name="q_1079112_best_describes_you" id="q_1079112_other" 1456 value="other"/> 1457 1458 <label for="q_1079112_other"> 1459 Other: 1460 </label> 1461 1462 <input type="text" class="other" name="q_1079112_best_describes_you_other" value="" 1463 style="width: 75%"/> 1464 </li> 1465 </ul> 1466 </div> 1467 </div> 1468 </div> 1469 1470 <div class="PDF_questionDivide" id="pd-divider-33"></div> 1471 1472 <div class="PDF_question"> 1473 <div class="button"> 1474 <input type="submit" name="submit-application" value="Submit Application"/> 1475 </div> 1476 </div> 1477 1478 </div> <!-- PDF.pageInner --> 1479 </div> <!-- PDF.pageOuter --> 1480 1481 </form> 1482 1483 <?php 1484 } -
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/views/wordcamp/metabox-status.php
r6186 r7607 2 2 defined( 'WPINC' ) || die(); 3 3 4 $wcpt = get_post_type_object( WCPT_POST_TYPE_ID ); 5 ?> 4 /** 5 * Renders the status metabox for events. Will display current status of the event. If user has edit_post access then will display dropdown of all available statuses for this post. 6 * 7 * @param Event_Admin $event_admin Event admin object. Must have methods `get_valid_status_transitions` and `get_post_statuses` 8 * @param WP_Post $post Post object 9 * @param string $event_type Type of event. Could be 'wordcamp' or 'wp_meetup'. 10 * @param string $label Label to display. Could be 'WordCamp' or 'Meetup' as of now. 11 * @param string $edit_capability Name of the capability which allows to edit the event 12 */ 13 function render_event_metabox( $event_admin, $post, $event_type, $label, $edit_capability ) { 14 $wcpt = get_post_type_object( $event_type ); 15 ?> 6 16 7 <div id="submitpost" class="wcb submitbox">8 <div id="minor-publishing">9 <div id="misc-publishing-actions">10 <div class="misc-pub-section misc-pub-post-status">11 <label>12 WordCampStatus:17 <div id="submitpost" class="wcb submitbox"> 18 <div id="minor-publishing"> 19 <div id="misc-publishing-actions"> 20 <div class="misc-pub-section misc-pub-post-status"> 21 <label> 22 <?php echo $label; ?> Status: 13 23 14 <?php if ( current_user_can( 'wordcamp_wrangle_wordcamps') ) : ?>24 <?php if ( current_user_can( $edit_capability ) ) : ?> 15 25 16 <span id="post-status-display">26 <span id="post-status-display"> 17 27 <select name="post_status"> 18 <?php $transitions = WordCamp_Loader::get_valid_status_transitions( $post->post_status ); ?> 19 <?php foreach ( WordCamp_Loader::get_post_statuses() as $key => $label ) : ?> 28 <?php $transitions = $event_admin->get_valid_status_transitions( $post->post_status ); 29 ?> 30 <?php foreach ( $event_admin->get_post_statuses() as $key => $label ) : ?> 20 31 <?php $status = get_post_status_object( $key ); ?> 21 32 <option value="<?php echo esc_attr( $status->name ); ?>" <?php … … 32 43 </span> 33 44 34 <?php else : ?>45 <?php else : ?> 35 46 36 <span id="post-status-display">47 <span id="post-status-display"> 37 48 <?php 38 49 $status = get_post_status_object( $post->post_status ); … … 41 52 </span> 42 53 43 <?php endif; ?> 44 </label> 54 <?php endif; ?> 55 </label> 56 </div> 57 <div class="clear"></div> 58 </div> <!-- #misc-publishing-actions --> 59 60 <div class="clear"></div> 61 </div> <!-- #minor-publishing --> 62 63 <div id="major-publishing-actions"> 64 <div id="delete-action"> 65 <?php if ( current_user_can( $wcpt->cap->delete_post, $post->ID ) ) : ?> 66 <a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>"> 67 <?php _e( 'Delete', 'wordcamporg' ); ?> 68 </a> 69 <?php endif; ?> 45 70 </div> 71 72 <div id="publishing-action"> 73 <?php submit_button( 'Update', 'primary button-large', 'wcpt-update', false, array( 'accesskey' => 'p' ) ); ?> 74 </div> 75 46 76 <div class="clear"></div> 47 </div> <!-- #m isc-publishing-actions -->77 </div> <!-- #major-publishing-actions --> 48 78 49 <div class="clear"></div> 50 </div> <!-- #minor-publishing --> 51 52 <div id="major-publishing-actions"> 53 <div id="delete-action"> 54 <?php if ( current_user_can( $wcpt->cap->delete_post, $post->ID ) ) : ?> 55 <a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>"> 56 <?php _e( 'Delete', 'wordcamporg' ); ?> 57 </a> 58 <?php endif; ?> 59 </div> 60 61 <div id="publishing-action"> 62 <?php submit_button( 'Update', 'primary button-large', 'wcpt-update', false, array( 'accesskey' => 'p' ) ); ?> 63 </div> 64 65 <div class="clear"></div> 66 </div> <!-- #major-publishing-actions --> 67 68 </div> <!-- .submitbox --> 79 </div> <!-- .submitbox --> 80 <?php 81 } -
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-functions.php
r6727 r7607 72 72 * Get all the the entries 73 73 * 74 * @param int $ wordcamp_id74 * @param int $event_id 75 75 * 76 76 * @return array 77 77 */ 78 function wcpt_get_log_entries( $ wordcamp_id ) {78 function wcpt_get_log_entries( $event_id ) { 79 79 /* 80 80 * @todo Rename `_note` meta fields to `_private_note` to make it obvious to devs that the value should be … … 83 83 */ 84 84 $entries = array(); 85 $private_notes = get_post_meta( $ wordcamp_id, '_note' );86 $status_changes = get_post_meta( $ wordcamp_id, '_status_change' );85 $private_notes = get_post_meta( $event_id, '_note' ); 86 $status_changes = get_post_meta( $event_id, '_status_change' ); 87 87 88 88 foreach ( array( 'note' => $private_notes, 'status_change' => $status_changes ) as $entry_type => $raw_entries ) { -
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-loader.php
r7221 r7607 46 46 require_once ( WCPT_DIR . 'wcpt-functions.php' ); 47 47 require_once ( WCPT_DIR . 'wcpt-wordcamp/wordcamp-loader.php' ); 48 require_once ( WCPT_DIR . 'applications/common.php' ); 49 require_once ( WCPT_DIR . 'applications/tracker.php' ); 50 require_once ( WCPT_DIR . 'applications/wordcamp.php' ); 48 require_once ( WCPT_DIR . 'wcpt-meetup/meetup-loader.php' ); 49 require_once ( WCPT_DIR . 'wcpt-event/tracker.php' ); 50 require_once ( WCPT_DIR . 'wcpt-wordcamp/wordcamp.php' ); 51 require_once ( WCPT_DIR . 'wcpt-meetup/meetup.php' ); 52 require_once ( WCPT_DIR . 'wcpt-meetup/class-meetup-admin.php' ); 51 53 52 54 // Require admin files. … … 68 70 $GLOBALS['wcpt_admin'] = new WCPT_Admin; 69 71 $GLOBALS['wordcamp_admin'] = new WordCamp_Admin; 72 $GLOBALS['meetup_admin'] = new Meetup_Admin(); 70 73 } 71 74 … … 88 91 $wcpt_loader = new WCPT_Loader; 89 92 $wordcamp_loader = new WordCamp_Loader; 93 $meetup_loader = new Meetup_Loader(); -
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-admin.php
r7485 r7607 2 2 3 3 use WordCamp\Mentors_Dashboard; 4 use WordPress_Community\Applications\WordCamp_Application; 5 6 require_once WCPT_DIR . 'wcpt-event/class-event-admin.php'; 4 7 5 8 if ( ! class_exists( 'WordCamp_Admin' ) ) : 6 /**7 * WCPT_Admin8 *9 * Loads plugin admin area10 *11 * @package WordCamp Post Type12 * @subpackage Admin13 * @since WordCamp Post Type (0.1)14 */15 class WordCamp_Admin {16 protected $active_admin_notices;17 18 9 /** 19 * Initialize WCPT Admin 10 * WCPT_Admin 11 * 12 * Loads plugin admin area 13 * 14 * @package WordCamp Post Type 15 * @subpackage Admin 16 * @since WordCamp Post Type (0.1) 20 17 */ 21 function __construct() { 22 $this->active_admin_notices = array(); 23 24 // Add some general styling to the admin area 25 add_action( 'wcpt_admin_head', array( $this, 'admin_head' ) ); 26 27 // Forum column headers. 28 add_filter( 'manage_' . WCPT_POST_TYPE_ID . '_posts_columns', array( $this, 'column_headers' ) ); 29 add_filter( 'display_post_states', array( $this, 'display_post_states' ) ); 30 31 // Forum columns (in page row) 32 add_action( 'manage_posts_custom_column', array( $this, 'column_data' ), 10, 2 ); 33 add_filter( 'post_row_actions', array( $this, 'post_row_actions' ), 10, 2 ); 34 35 // Topic metabox actions 36 add_action( 'add_meta_boxes', array( $this, 'metabox' ) ); 37 add_action( 'save_post_' . WCPT_POST_TYPE_ID, array( $this, 'metabox_save' ), 10, 2 ); 38 39 // Scripts and CSS 40 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) ); 41 add_action( 'admin_print_styles', array( $this, 'admin_styles' ) ); 42 43 // Post status transitions 44 add_action( 'transition_post_status', array( $this, 'trigger_schedule_actions' ), 10, 3 ); 45 add_action( 'transition_post_status', array( $this, 'log_status_changes' ), 10, 3 ); 46 add_action( 'wcpt_approved_for_pre_planning', array( $this, 'add_organizer_to_central' ), 10 ); 47 add_action( 'wcpt_approved_for_pre_planning', array( $this, 'mark_date_added_to_planning_schedule' ), 10 ); 48 add_filter( 'wp_insert_post_data', array( $this, 'enforce_post_status' ), 10, 2 ); 49 add_filter( 'wp_insert_post_data', array( $this, 'require_complete_meta_to_publish_wordcamp' ), 11, 2 ); // after enforce_post_status 50 51 // Admin notices 52 add_action( 'admin_notices', array( $this, 'print_admin_notices' ) ); 53 add_filter( 'redirect_post_location', array( $this, 'add_admin_notices_to_redirect_url' ), 10, 2 ); 54 55 // Cron jobs 56 add_action( 'plugins_loaded', array( $this, 'schedule_cron_jobs' ), 11 ); 57 add_action( 'wcpt_close_wordcamps_after_event', array( $this, 'close_wordcamps_after_event' ) ); 58 } 59 60 /** 61 * metabox () 62 * 63 * Add the metabox 64 * 65 * @uses add_meta_box 66 */ 67 function metabox() { 68 add_meta_box( 69 'wcpt_information', 70 __( 'WordCamp Information', 'wcpt' ), 71 'wcpt_wordcamp_metabox', 72 WCPT_POST_TYPE_ID, 73 'advanced', 74 'high' 75 ); 76 77 add_meta_box( 78 'wcpt_organizer_info', 79 __( 'Organizing Team', 'wcpt' ), 80 'wcpt_organizer_metabox', 81 WCPT_POST_TYPE_ID, 82 'advanced', 83 'high' 84 ); 85 86 add_meta_box( 87 'wcpt_venue_info', 88 __( 'Venue Information', 'wcpt' ), 89 'wcpt_venue_metabox', 90 WCPT_POST_TYPE_ID, 91 'advanced', 92 'high' 93 ); 94 95 add_meta_box( 96 'wcpt_contributor_info', 97 __( 'Contributor Day Information', 'wcpt' ), 98 'wcpt_contributor_metabox', 99 WCPT_POST_TYPE_ID, 100 'advanced' 101 ); 102 103 add_meta_box( 104 'wcpt_original_application', 105 'Original Application', 106 array( $this, 'original_application_metabox' ), 107 WCPT_POST_TYPE_ID, 108 'advanced', 109 'low' 110 ); 111 112 // Notes are private, so only show them to WordCamp Wranglers 113 if ( current_user_can( 'wordcamp_wrangle_wordcamps' ) ) { 18 class WordCamp_Admin extends Event_Admin { 19 protected $active_admin_notices; 20 21 /** 22 * Initialize WCPT Admin 23 */ 24 function __construct() { 25 26 parent::__construct(); 27 28 $this->active_admin_notices = array(); 29 30 // Add some general styling to the admin area 31 add_action( 'wcpt_admin_head', array( $this, 'admin_head' ) ); 32 33 // Scripts and CSS 34 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) ); 35 36 // Post status transitions 37 add_action( 'transition_post_status', array( $this, 'trigger_schedule_actions' ), 10, 3 ); 38 add_action( 'wcpt_approved_for_pre_planning', array( $this, 'add_organizer_to_central' ), 10 ); 39 add_action( 'wcpt_approved_for_pre_planning', array( $this, 'mark_date_added_to_planning_schedule' ), 10 ); 40 41 add_filter( 'wp_insert_post_data', array( $this, 'enforce_post_status' ), 10, 2 ); 42 43 add_filter( 44 'wp_insert_post_data', array( 45 $this, 46 'require_complete_meta_to_publish_wordcamp', 47 ), 11, 2 48 ); // after enforce_post_status 49 50 // Admin notices 51 add_action( 'admin_notices', array( $this, 'print_admin_notices' ) ); 52 53 add_filter( 'redirect_post_location', array( $this, 'add_admin_notices_to_redirect_url' ), 10, 2 ); 54 55 // Cron jobs 56 add_action( 'plugins_loaded', array( $this, 'schedule_cron_jobs' ), 11 ); 57 add_action( 'wcpt_close_wordcamps_after_event', array( $this, 'close_wordcamps_after_event' ) ); 58 add_action( 'wcpt_metabox_save_done', array( $this, 'update_venue_address' ) ); 59 add_action( 'wcpt_metabox_save_done', array( $this, 'update_mentor' ) ); 60 } 61 62 /** 63 * metabox () 64 * 65 * Add the metabox 66 * 67 * @uses add_meta_box 68 */ 69 function metabox() { 114 70 add_meta_box( 115 'wcpt_notes', 116 __( 'Add Private Note', 'wordcamporg' ), 117 'wcpt_add_note_metabox', 118 WCPT_POST_TYPE_ID, 119 'side', 120 'low' 121 ); 122 123 add_meta_box( 124 'wcpt_log', 125 'Log', 126 'wcpt_log_metabox', 71 'wcpt_information', 72 __( 'WordCamp Information', 'wcpt' ), 73 'wcpt_wordcamp_metabox', 127 74 WCPT_POST_TYPE_ID, 128 75 'advanced', 129 ' low'76 'high' 130 77 ); 131 } 132 133 // Remove core's submitdiv. 134 remove_meta_box( 'submitdiv', WCPT_POST_TYPE_ID, 'side' ); 135 136 $statuses = WordCamp_Loader::get_post_statuses(); 137 138 add_meta_box( 139 'submitdiv', 140 __( 'Status', 'wordcamporg' ), 141 array( $this, 'metabox_status' ), 142 WCPT_POST_TYPE_ID, 143 'side', 144 'high' 145 ); 146 } 147 148 /** 149 * metabox_save () 150 * 151 * Pass the metabox values before saving 152 * 153 * @param int $post_id 154 * @return int 155 */ 156 function metabox_save( $post_id, $post ) { 157 // Don't add/remove meta on revisions and auto-saves 158 if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) 159 return; 160 161 // Don't add/remove meta on trash, untrash, restore, etc 162 if ( empty( $_POST['action'] ) || 'editpost' != $_POST['action'] ) { 163 return; 164 } 165 166 // WordCamp post type only 167 if ( WCPT_POST_TYPE_ID != get_post_type() ) { 168 return; 169 } 170 171 // Make sure the requset came from the edit post screen. 172 if ( empty( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post_' . $post_id ) ) { 173 return; 174 } 175 176 // If the venue address was changed, update its coordinates 177 $new_address = $_POST[ wcpt_key_to_str( 'Physical Address', 'wcpt_' ) ]; 178 if ( $new_address != get_post_meta( $post_id, 'Physical Address', true ) ) { 179 $this->update_venue_address( $post_id, $new_address ); 180 } 181 182 // If the Mentor username changed, update the site 183 $mentor_username = $_POST[ wcpt_key_to_str( 'Mentor WordPress.org User Name', 'wcpt_' ) ]; 184 if ( $mentor_username !== get_post_meta( $post_id, 'Mentor WordPress.org User Name', true ) ) { 185 $this->add_mentor( $post, $mentor_username ); 186 } 187 188 // Post meta keys 189 $wcpt_meta_keys = WordCamp_Admin::meta_keys(); 190 191 // Loop through meta keys and update 192 foreach ( $wcpt_meta_keys as $key => $value ) { 193 // Get post value 194 $post_value = wcpt_key_to_str( $key, 'wcpt_' ); 195 $values[ $key ] = isset( $_POST[ $post_value ] ) ? esc_attr( $_POST[ $post_value ] ) : ''; 196 197 // Don't update protected fields 198 if ( self::is_protected_field( $key ) ) { 199 continue; 200 } 201 202 switch ( $value ) { 203 case 'text' : 204 case 'textarea' : 205 update_post_meta( $post_id, $key, $values[ $key ] ); 206 break; 207 208 case 'number' : 209 update_post_meta( $post_id, $key, floatval( $values[ $key ] ) ); 210 break; 211 212 case 'checkbox' : 213 if ( ! empty( $values[ $key ] ) && 'on' == $values[ $key ] ) { 214 update_post_meta( $post_id, $key, true ); 215 } else { 216 update_post_meta( $post_id, $key, false ); 78 79 add_meta_box( 80 'wcpt_organizer_info', 81 __( 'Organizing Team', 'wcpt' ), 82 'wcpt_organizer_metabox', 83 WCPT_POST_TYPE_ID, 84 'advanced', 85 'high' 86 ); 87 88 add_meta_box( 89 'wcpt_venue_info', 90 __( 'Venue Information', 'wcpt' ), 91 'wcpt_venue_metabox', 92 WCPT_POST_TYPE_ID, 93 'advanced', 94 'high' 95 ); 96 97 add_meta_box( 98 'wcpt_contributor_info', 99 __( 'Contributor Day Information', 'wcpt' ), 100 'wcpt_contributor_metabox', 101 WCPT_POST_TYPE_ID, 102 'advanced' 103 ); 104 105 } 106 107 /** 108 * Get label for event type 109 * 110 * @return string 111 */ 112 static function get_event_label() { 113 return WordCamp_Application::get_event_label(); 114 } 115 116 /** 117 * Get wordcamp post type 118 * 119 * @return string 120 */ 121 static function get_event_type() { 122 return WordCamp_Application::get_event_type(); 123 } 124 125 /** 126 * Check if a field is readonly. 127 * 128 * @param $key 129 * 130 * @return bool 131 */ 132 function _is_protected_field( $key ) { 133 return self::is_protected_field( $key ); 134 } 135 136 public function update_mentor( $post_id ) { 137 if ( $this->get_event_type() !== get_post_type() ) { 138 return; 139 } 140 141 // If the Mentor username changed, update the site 142 $mentor_username = $_POST[ wcpt_key_to_str( 'Mentor WordPress.org User Name', 'wcpt_' ) ]; 143 if ( $mentor_username !== get_post_meta( $post_id, 'Mentor WordPress.org User Name', true ) ) { 144 $this->add_mentor( get_post( $post_id ), $mentor_username ); 145 } 146 147 } 148 149 /** 150 * Update venue address co-ords if changed 151 * 152 * These are used for the maps on Central, stats, etc. 153 * 154 * @param int $post_id Post id 155 */ 156 public function update_venue_address( $post_id ) { 157 if ( $this->get_event_type() !== get_post_type() ) { 158 return; 159 } 160 161 // If the venue address was changed, update its coordinates 162 $new_address = $_POST[ wcpt_key_to_str( 'Physical Address', 'wcpt_' ) ]; 163 if ( $new_address === get_post_meta( $post_id, 'Physical Address', true ) ) { 164 return; 165 } 166 167 $request_url = add_query_arg( 168 'address', 169 urlencode( $new_address ), 170 'https://maps.googleapis.com/maps/api/geocode/json' 171 ); 172 173 $response = wcorg_redundant_remote_get( $request_url ); 174 175 // Don't delete the existing (and probably good) values if the request failed 176 if ( is_wp_error( $response ) ) { 177 return; 178 } 179 180 $meta_values = $this->parse_geocode_response( $response ); 181 182 foreach ( $meta_values as $key => $value ) { 183 if ( is_null( $value ) ) { 184 delete_post_meta( $post_id, $key ); 185 } else { 186 update_post_meta( $post_id, $key, $value ); 187 } 188 } 189 190 } 191 192 /** 193 * Parse the values we want out of the Geocode API response 194 * 195 * @see https://developers.google.com/maps/documentation/geocoding/intro#Types API response schema 196 * 197 * @param $response 198 * 199 * @return array 200 */ 201 protected function parse_geocode_response( $response ) { 202 $body = json_decode( wp_remote_retrieve_body( $response ) ); 203 $body = isset( $body->results[0] ) ? $body->results[0] : null; 204 205 if ( isset( $body->geometry->location->lat ) ) { 206 $coordinates = array( 207 'latitude' => $body->geometry->location->lat, 208 'longitude' => $body->geometry->location->lng, 209 ); 210 } 211 212 if ( isset( $body->address_components ) ) { 213 foreach ( $body->address_components as $component ) { 214 foreach ( $component->types as $type ) { 215 switch ( $type ) { 216 217 case 'locality': 218 case 'administrative_area_level_1': 219 case 'postal_code': 220 $$type = $component->long_name; 221 break; 222 223 case 'country': 224 $country_code = $component->short_name; // This is not guaranteed to be ISO 3166-1 alpha-2, but should match in most cases 225 $country_name = $component->long_name; 226 break; 227 228 } 217 229 } 218 break; 219 220 case 'date' : 221 if ( !empty( $values[ $key ] ) ) { 222 $values[ $key ] = strtotime( $values[ $key ] ); 223 } 224 225 update_post_meta( $post_id, $key, $values[ $key ] ); 226 break; 227 228 case 'select-currency' : 229 $currencies = WordCamp_Budgets::get_currencies(); 230 $new_value = ( array_key_exists( $values[ $key ], $currencies ) ) ? $values[ $key ] : ''; 231 232 update_post_meta( $post_id, $key, $new_value ); 233 break; 234 230 } 231 } 232 233 $values = array( 234 '_venue_coordinates' => isset( $coordinates ) ? $coordinates : null, 235 '_venue_city' => isset( $locality ) ? $locality : null, 236 '_venue_state' => isset( $administrative_area_level_1 ) ? $administrative_area_level_1 : null, 237 '_venue_country_code' => isset( $country_code ) ? $country_code : null, 238 '_venue_country_name' => isset( $country_name ) ? $country_name : null, 239 '_venue_zip' => isset( $postal_code ) ? $postal_code : null, 240 ); 241 242 return $values; 243 } 244 245 /** 246 * Add the Mentor as an administrator on the given site. 247 * 248 * @param WP_Post $wordcamp WordCamp post object. 249 * @param string $mentor_username Mentor's WP.org user login. 250 */ 251 protected function add_mentor( $wordcamp, $mentor_username ) { 252 $blog_id = get_wordcamp_site_id( $wordcamp ); 253 $new_mentor = get_user_by( 'login', $mentor_username ); 254 255 if ( ! $blog_id || ! $new_mentor ) { 256 return; 257 } 258 259 add_user_to_blog( $blog_id, $new_mentor->ID, 'administrator' ); 260 } 261 262 /** 263 * meta_keys () 264 * 265 * Returns post meta key 266 * 267 * @param string $meta_group 268 * 269 * @return array 270 */ 271 static function meta_keys( $meta_group = '' ) { 272 /* 273 * Warning: These keys are used for both the input field label and the postmeta key, so if you want to 274 * modify an existing label then you'll also need to migrate any rows in the database to use the new key. 275 * 276 * Some of them are also exposed via the JSON API, so you'd need to build in a back-compat layer for that 277 * as well. 278 * 279 * When adding new keys, updating the wcorg-json-api plugin to either whitelist it, or test that it's not 280 * being exposed. 281 */ 282 283 switch ( $meta_group ) { 284 case 'organizer': 285 $retval = array( 286 'Organizer Name' => 'text', 287 'WordPress.org Username' => 'text', 288 'Email Address' => 'text', // Note: This is the lead organizer's e-mail address, which is different than the "E-mail Address" field 289 'Telephone' => 'text', 290 'Mailing Address' => 'textarea', 291 'Sponsor Wrangler Name' => 'text', 292 'Sponsor Wrangler E-mail Address' => 'text', 293 'Budget Wrangler Name' => 'text', 294 'Budget Wrangler E-mail Address' => 'text', 295 'Venue Wrangler Name' => 'text', 296 'Venue Wrangler E-mail Address' => 'text', 297 'Speaker Wrangler Name' => 'text', 298 'Speaker Wrangler E-mail Address' => 'text', 299 'Food/Beverage Wrangler Name' => 'text', 300 'Food/Beverage Wrangler E-mail Address' => 'text', 301 'Swag Wrangler Name' => 'text', 302 'Swag Wrangler E-mail Address' => 'text', 303 'Volunteer Wrangler Name' => 'text', 304 'Volunteer Wrangler E-mail Address' => 'text', 305 'Printing Wrangler Name' => 'text', 306 'Printing Wrangler E-mail Address' => 'text', 307 'Design Wrangler Name' => 'text', 308 'Design Wrangler E-mail Address' => 'text', 309 'Website Wrangler Name' => 'text', 310 'Website Wrangler E-mail Address' => 'text', 311 'Social Media/Publicity Wrangler Name' => 'text', 312 'Social Media/Publicity Wrangler E-mail Address' => 'text', 313 'A/V Wrangler Name' => 'text', 314 'A/V Wrangler E-mail Address' => 'text', 315 'Party Wrangler Name' => 'text', 316 'Party Wrangler E-mail Address' => 'text', 317 'Travel Wrangler Name' => 'text', 318 'Travel Wrangler E-mail Address' => 'text', 319 'Safety Wrangler Name' => 'text', 320 'Safety Wrangler E-mail Address' => 'text', 321 'Mentor WordPress.org User Name' => 'text', 322 'Mentor Name' => 'text', 323 'Mentor E-mail Address' => 'text', 324 ); 325 326 break; 327 328 case 'venue': 329 $retval = array( 330 'Venue Name' => 'text', 331 'Physical Address' => 'textarea', 332 'Maximum Capacity' => 'text', 333 'Available Rooms' => 'text', 334 'Website URL' => 'text', 335 'Contact Information' => 'textarea', 336 'Exhibition Space Available' => 'checkbox', 337 ); 338 break; 339 340 case 'contributor': 341 // These fields names need to be unique, hence the 'Contributor' prefix on each one 342 $retval = array( 343 'Contributor Day' => 'checkbox', 344 'Contributor Day Date (YYYY-mm-dd)' => 'date', 345 'Contributor Venue Name' => 'text', 346 'Contributor Venue Address' => 'textarea', 347 'Contributor Venue Capacity' => 'text', 348 'Contributor Venue Website URL' => 'text', 349 'Contributor Venue Contact Info' => 'textarea', 350 ); 351 break; 352 353 case 'wordcamp': 354 $retval = array( 355 'Start Date (YYYY-mm-dd)' => 'date', 356 'End Date (YYYY-mm-dd)' => 'date', 357 'Location' => 'text', 358 'URL' => 'wc-url', 359 'E-mail Address' => 'text', 360 // Note: This is the address for the entire organizing team, which is different than the "Email Address" field 361 'Twitter' => 'text', 362 'WordCamp Hashtag' => 'text', 363 'Number of Anticipated Attendees' => 'text', 364 'Multi-Event Sponsor Region' => 'mes-dropdown', 365 'Global Sponsorship Grant Currency' => 'select-currency', 366 'Global Sponsorship Grant Amount' => 'number', 367 'Global Sponsorship Grant' => 'text', 368 ); 369 break; 370 371 case 'all': 235 372 default: 236 do_action( 'wcpt_metabox_save', $key, $value, $post_id ); 237 break; 238 } 239 } 240 241 do_action( 'wcpt_metabox_save_done', $post_id ); 242 243 $this->validate_and_add_note( $post_id ); 244 } 245 246 /** 247 * Validate and add a new private note 248 * 249 * @param int $post_id 250 */ 251 protected function validate_and_add_note( $post_id ) { 252 if ( empty( $_POST['wcpt_new_note' ] ) ) 253 return; 254 255 check_admin_referer( 'wcpt_notes', 'wcpt_notes_nonce' ); 256 257 $new_note_message = sanitize_text_field( wp_unslash( $_POST['wcpt_new_note'] ) ); 258 259 if ( empty( $new_note_message ) ) { 260 return; 261 } 262 263 // Note that this is private, see wcpt_get_log_entries() 264 add_post_meta( $post_id, '_note', array( 265 'timestamp' => time(), 266 'user_id' => get_current_user_id(), 267 'message' => $new_note_message, 268 ) ); 269 } 270 271 /** 272 * Store the individual components of a camp's venue address 273 * 274 * These are used for the maps on Central, stats, etc. 275 * 276 * @param int $post_id 277 * @param string $address 278 */ 279 function update_venue_address( $post_id, $address ) { 280 $request_url = add_query_arg( 281 'address', 282 urlencode( $address ), 283 'https://maps.googleapis.com/maps/api/geocode/json' 284 ); 285 286 $response = wcorg_redundant_remote_get( $request_url ); 287 288 // Don't delete the existing (and probably good) values if the request failed 289 if ( is_wp_error( $response ) ) { 290 return; 291 } 292 293 $meta_values = $this->parse_geocode_response( $response ); 294 295 foreach ( $meta_values as $key => $value ) { 296 if ( is_null( $value ) ) { 297 delete_post_meta( $post_id, $key ); 298 } else { 299 update_post_meta( $post_id, $key, $value ); 300 } 301 } 302 } 303 304 /** 305 * Parse the values we want out of the Geocode API response 306 * 307 * @see https://developers.google.com/maps/documentation/geocoding/intro#Types API response schema 308 * 309 * @param $response 310 * 311 * @return array 312 */ 313 protected function parse_geocode_response( $response ) { 314 $body = json_decode( wp_remote_retrieve_body( $response ) ); 315 $body = isset ( $body->results[0] ) ? $body->results[0] : null; 316 317 if ( isset( $body->geometry->location->lat ) ) { 318 $coordinates = array( 319 'latitude' => $body->geometry->location->lat, 320 'longitude' => $body->geometry->location->lng 321 ); 322 } 323 324 if ( isset ( $body->address_components ) ) { 325 foreach ( $body->address_components as $component ) { 326 foreach ( $component->types as $type ) { 327 switch ( $type ) { 328 329 case 'locality': 330 case 'administrative_area_level_1': 331 case 'postal_code': 332 $$type = $component->long_name; 333 break; 334 335 case 'country': 336 $country_code = $component->short_name; // This is not guaranteed to be ISO 3166-1 alpha-2, but should match in most cases 337 $country_name = $component->long_name; 338 break; 339 340 } 341 } 342 } 343 } 344 345 $values = array( 346 '_venue_coordinates' => isset( $coordinates ) ? $coordinates : null, 347 '_venue_city' => isset( $locality ) ? $locality : null, 348 '_venue_state' => isset( $administrative_area_level_1 ) ? $administrative_area_level_1 : null, 349 '_venue_country_code' => isset( $country_code ) ? $country_code : null, 350 '_venue_country_name' => isset( $country_name ) ? $country_name : null, 351 '_venue_zip' => isset( $postal_code ) ? $postal_code : null, 352 ); 353 354 return $values; 355 } 356 357 /** 358 * Add the Mentor as an administrator on the given site. 359 * 360 * @param WP_Post $wordcamp WordCamp post object. 361 * @param string $mentor_username Mentor's WP.org user login. 362 */ 363 protected function add_mentor( $wordcamp, $mentor_username ) { 364 $blog_id = get_wordcamp_site_id( $wordcamp ); 365 $new_mentor = get_user_by( 'login', $mentor_username ); 366 367 if ( ! $blog_id || ! $new_mentor ) { 368 return; 369 } 370 371 add_user_to_blog( $blog_id, $new_mentor->ID, 'administrator' ); 372 } 373 374 /** 375 * meta_keys () 376 * 377 * Returns post meta key 378 * 379 * @param string $meta_group 380 * 381 * @return array 382 */ 383 function meta_keys( $meta_group = '' ) { 384 /* 385 * Warning: These keys are used for both the input field label and the postmeta key, so if you want to 386 * modify an existing label then you'll also need to migrate any rows in the database to use the new key. 387 * 388 * Some of them are also exposed via the JSON API, so you'd need to build in a back-compat layer for that 389 * as well. 390 * 391 * When adding new keys, updating the wcorg-json-api plugin to either whitelist it, or test that it's not 392 * being exposed. 393 */ 394 395 switch ( $meta_group ) { 396 case 'organizer': 397 $retval = array ( 398 'Organizer Name' => 'text', 399 'WordPress.org Username' => 'text', 400 'Email Address' => 'text', // Note: This is the lead organizer's e-mail address, which is different than the "E-mail Address" field 401 'Telephone' => 'text', 402 'Mailing Address' => 'textarea', 403 'Sponsor Wrangler Name' => 'text', 404 'Sponsor Wrangler E-mail Address' => 'text', 405 'Budget Wrangler Name' => 'text', 406 'Budget Wrangler E-mail Address' => 'text', 407 'Venue Wrangler Name' => 'text', 408 'Venue Wrangler E-mail Address' => 'text', 409 'Speaker Wrangler Name' => 'text', 410 'Speaker Wrangler E-mail Address' => 'text', 411 'Food/Beverage Wrangler Name' => 'text', 412 'Food/Beverage Wrangler E-mail Address' => 'text', 413 'Swag Wrangler Name' => 'text', 414 'Swag Wrangler E-mail Address' => 'text', 415 'Volunteer Wrangler Name' => 'text', 416 'Volunteer Wrangler E-mail Address' => 'text', 417 'Printing Wrangler Name' => 'text', 418 'Printing Wrangler E-mail Address' => 'text', 419 'Design Wrangler Name' => 'text', 420 'Design Wrangler E-mail Address' => 'text', 421 'Website Wrangler Name' => 'text', 422 'Website Wrangler E-mail Address' => 'text', 423 'Social Media/Publicity Wrangler Name' => 'text', 424 'Social Media/Publicity Wrangler E-mail Address' => 'text', 425 'A/V Wrangler Name' => 'text', 426 'A/V Wrangler E-mail Address' => 'text', 427 'Party Wrangler Name' => 'text', 428 'Party Wrangler E-mail Address' => 'text', 429 'Travel Wrangler Name' => 'text', 430 'Travel Wrangler E-mail Address' => 'text', 431 'Safety Wrangler Name' => 'text', 432 'Safety Wrangler E-mail Address' => 'text', 433 'Mentor WordPress.org User Name' => 'text', 434 'Mentor Name' => 'text', 435 'Mentor E-mail Address' => 'text', 373 $retval = array( 374 'Start Date (YYYY-mm-dd)' => 'date', 375 'End Date (YYYY-mm-dd)' => 'date', 376 'Location' => 'text', 377 'URL' => 'wc-url', 378 'E-mail Address' => 'text', 379 'Twitter' => 'text', 380 'WordCamp Hashtag' => 'text', 381 'Number of Anticipated Attendees' => 'text', 382 'Multi-Event Sponsor Region' => 'mes-dropdown', 383 'Global Sponsorship Grant Currency' => 'select-currency', 384 'Global Sponsorship Grant Amount' => 'number', 385 'Global Sponsorship Grant' => 'text', 386 387 'Organizer Name' => 'text', 388 'WordPress.org Username' => 'text', 389 'Email Address' => 'text', 390 'Telephone' => 'text', 391 'Mailing Address' => 'textarea', 392 'Sponsor Wrangler Name' => 'text', 393 'Sponsor Wrangler E-mail Address' => 'text', 394 'Budget Wrangler Name' => 'text', 395 'Budget Wrangler E-mail Address' => 'text', 396 'Venue Wrangler Name' => 'text', 397 'Venue Wrangler E-mail Address' => 'text', 398 'Speaker Wrangler Name' => 'text', 399 'Speaker Wrangler E-mail Address' => 'text', 400 'Food/Beverage Wrangler Name' => 'text', 401 'Food/Beverage Wrangler E-mail Address' => 'text', 402 'Swag Wrangler Name' => 'text', 403 'Swag Wrangler E-mail Address' => 'text', 404 'Volunteer Wrangler Name' => 'text', 405 'Volunteer Wrangler E-mail Address' => 'text', 406 'Printing Wrangler Name' => 'text', 407 'Printing Wrangler E-mail Address' => 'text', 408 'Design Wrangler Name' => 'text', 409 'Design Wrangler E-mail Address' => 'text', 410 'Website Wrangler Name' => 'text', 411 'Website Wrangler E-mail Address' => 'text', 412 'Social Media/Publicity Wrangler Name' => 'text', 413 'Social Media/Publicity Wrangler E-mail Address' => 'text', 414 'A/V Wrangler Name' => 'text', 415 'A/V Wrangler E-mail Address' => 'text', 416 'Party Wrangler Name' => 'text', 417 'Party Wrangler E-mail Address' => 'text', 418 'Travel Wrangler Name' => 'text', 419 'Travel Wrangler E-mail Address' => 'text', 420 'Safety Wrangler Name' => 'text', 421 'Safety Wrangler E-mail Address' => 'text', 422 'Mentor WordPress.org User Name' => 'text', 423 'Mentor Name' => 'text', 424 'Mentor E-mail Address' => 'text', 425 426 'Venue Name' => 'text', 427 'Physical Address' => 'textarea', 428 'Maximum Capacity' => 'text', 429 'Available Rooms' => 'text', 430 'Website URL' => 'text', 431 'Contact Information' => 'textarea', 432 'Exhibition Space Available' => 'checkbox', 433 434 'Contributor Day' => 'checkbox', 435 'Contributor Day Date (YYYY-mm-dd)' => 'date', 436 'Contributor Venue Name' => 'text', 437 'Contributor Venue Address' => 'textarea', 438 'Contributor Venue Capacity' => 'text', 439 'Contributor Venue Website URL' => 'text', 440 'Contributor Venue Contact Info' => 'textarea', 441 ); 442 break; 443 444 } 445 446 return apply_filters( 'wcpt_admin_meta_keys', $retval, $meta_group ); 447 } 448 449 /** 450 * Fired during admin_print_styles 451 * Adds jQuery UI 452 */ 453 function admin_scripts() { 454 455 // Edit WordCamp screen 456 if ( WCPT_POST_TYPE_ID === get_post_type() ) { 457 458 // Default data 459 $data = array( 460 'Mentors' => array( 461 'l10n' => array( 462 'selectLabel' => esc_html__( 'Available mentors', 'wordcamporg' ), 463 'confirm' => esc_html__( 'Update Mentor field contents?', 'wordcamporg' ), 464 ), 465 ), 436 466 ); 437 467 438 break; 439 440 case 'venue': 441 $retval = array ( 442 'Venue Name' => 'text', 443 'Physical Address' => 'textarea', 444 'Maximum Capacity' => 'text', 445 'Available Rooms' => 'text', 446 'Website URL' => 'text', 447 'Contact Information' => 'textarea', 448 'Exhibition Space Available' => 'checkbox', 468 // Only include mentor data if the Mentor username field is editable 469 if ( current_user_can( 'wordcamp_manage_mentors' ) ) { 470 $data['Mentors']['data'] = Mentors_Dashboard\get_all_mentor_data(); 471 } 472 473 wp_localize_script( 474 'wcpt-admin', 475 'wordCampPostType', 476 $data 449 477 ); 450 break; 451 452 case 'contributor': 453 // These fields names need to be unique, hence the 'Contributor' prefix on each one 454 $retval = array ( 455 'Contributor Day' => 'checkbox', 456 'Contributor Day Date (YYYY-mm-dd)' => 'date', 457 'Contributor Venue Name' => 'text', 458 'Contributor Venue Address' => 'textarea', 459 'Contributor Venue Capacity' => 'text', 460 'Contributor Venue Website URL' => 'text', 461 'Contributor Venue Contact Info' => 'textarea', 462 ); 463 break; 464 465 case 'wordcamp': 466 $retval = array ( 467 'Start Date (YYYY-mm-dd)' => 'date', 468 'End Date (YYYY-mm-dd)' => 'date', 469 'Location' => 'text', 470 'URL' => 'wc-url', 471 'E-mail Address' => 'text', 472 // Note: This is the address for the entire organizing team, which is different than the "Email Address" field 473 'Twitter' => 'text', 474 'WordCamp Hashtag' => 'text', 475 'Number of Anticipated Attendees' => 'text', 476 'Multi-Event Sponsor Region' => 'mes-dropdown', 477 'Global Sponsorship Grant Currency' => 'select-currency', 478 'Global Sponsorship Grant Amount' => 'number', 479 'Global Sponsorship Grant' => 'text', 480 ); 481 break; 482 483 case 'all': 484 default: 485 $retval = array( 486 'Start Date (YYYY-mm-dd)' => 'date', 487 'End Date (YYYY-mm-dd)' => 'date', 488 'Location' => 'text', 489 'URL' => 'wc-url', 490 'E-mail Address' => 'text', 491 'Twitter' => 'text', 492 'WordCamp Hashtag' => 'text', 493 'Number of Anticipated Attendees' => 'text', 494 'Multi-Event Sponsor Region' => 'mes-dropdown', 495 'Global Sponsorship Grant Currency' => 'select-currency', 496 'Global Sponsorship Grant Amount' => 'number', 497 'Global Sponsorship Grant' => 'text', 498 499 'Organizer Name' => 'text', 500 'WordPress.org Username' => 'text', 501 'Email Address' => 'text', 502 'Telephone' => 'text', 503 'Mailing Address' => 'textarea', 504 'Sponsor Wrangler Name' => 'text', 505 'Sponsor Wrangler E-mail Address' => 'text', 506 'Budget Wrangler Name' => 'text', 507 'Budget Wrangler E-mail Address' => 'text', 508 'Venue Wrangler Name' => 'text', 509 'Venue Wrangler E-mail Address' => 'text', 510 'Speaker Wrangler Name' => 'text', 511 'Speaker Wrangler E-mail Address' => 'text', 512 'Food/Beverage Wrangler Name' => 'text', 513 'Food/Beverage Wrangler E-mail Address' => 'text', 514 'Swag Wrangler Name' => 'text', 515 'Swag Wrangler E-mail Address' => 'text', 516 'Volunteer Wrangler Name' => 'text', 517 'Volunteer Wrangler E-mail Address' => 'text', 518 'Printing Wrangler Name' => 'text', 519 'Printing Wrangler E-mail Address' => 'text', 520 'Design Wrangler Name' => 'text', 521 'Design Wrangler E-mail Address' => 'text', 522 'Website Wrangler Name' => 'text', 523 'Website Wrangler E-mail Address' => 'text', 524 'Social Media/Publicity Wrangler Name' => 'text', 525 'Social Media/Publicity Wrangler E-mail Address' => 'text', 526 'A/V Wrangler Name' => 'text', 527 'A/V Wrangler E-mail Address' => 'text', 528 'Party Wrangler Name' => 'text', 529 'Party Wrangler E-mail Address' => 'text', 530 'Travel Wrangler Name' => 'text', 531 'Travel Wrangler E-mail Address' => 'text', 532 'Safety Wrangler Name' => 'text', 533 'Safety Wrangler E-mail Address' => 'text', 534 'Mentor WordPress.org User Name' => 'text', 535 'Mentor Name' => 'text', 536 'Mentor E-mail Address' => 'text', 537 538 'Venue Name' => 'text', 539 'Physical Address' => 'textarea', 540 'Maximum Capacity' => 'text', 541 'Available Rooms' => 'text', 542 'Website URL' => 'text', 543 'Contact Information' => 'textarea', 544 'Exhibition Space Available' => 'checkbox', 545 546 'Contributor Day' => 'checkbox', 547 'Contributor Day Date (YYYY-mm-dd)' => 'date', 548 'Contributor Venue Name' => 'text', 549 'Contributor Venue Address' => 'textarea', 550 'Contributor Venue Capacity' => 'text', 551 'Contributor Venue Website URL' => 'text', 552 'Contributor Venue Contact Info' => 'textarea', 553 ); 554 break; 555 556 } 557 558 return apply_filters( 'wcpt_admin_meta_keys', $retval, $meta_group ); 559 } 560 561 /** 562 * Fired during admin_print_styles 563 * Adds jQuery UI 564 */ 565 function admin_scripts() { 566 wp_register_script( 567 'wcpt-admin', 568 WCPT_URL . 'javascript/wcpt-wordcamp/admin.js', 569 array( 'jquery', 'jquery-ui-datepicker' ), 570 WCPT_VERSION, 571 true 572 ); 573 574 // Edit WordCamp screen 575 if ( WCPT_POST_TYPE_ID === get_post_type() ) { 576 wp_enqueue_script( 'wcpt-admin' ); 577 578 // Default data 579 $data = array( 580 'Mentors' => array( 581 'l10n' => array( 582 'selectLabel' => esc_html__( 'Available mentors', 'wordcamporg' ), 583 'confirm' => esc_html__( 'Update Mentor field contents?', 'wordcamporg' ), 584 ), 585 ) 586 ); 587 588 // Only include mentor data if the Mentor username field is editable 589 if ( current_user_can( 'wordcamp_manage_mentors' ) ) { 590 $data['Mentors']['data'] = Mentors_Dashboard\get_all_mentor_data(); 591 } 592 593 wp_localize_script( 594 'wcpt-admin', 595 'wordCampPostType', 596 $data 597 ); 598 } 599 wp_enqueue_script( 'select2' ); 600 } 601 602 function admin_styles() { 603 if ( get_post_type() == WCPT_POST_TYPE_ID ) { 604 wp_enqueue_style( 'jquery-ui' ); 605 wp_enqueue_style( 'wp-datepicker-skins' ); 606 } 607 wp_enqueue_style( 'select2' ); 608 } 609 610 /** 611 * admin_head () 612 * 613 * Add some general styling to the admin area 614 */ 615 function admin_head() { 616 if ( !empty( $_GET['post_type'] ) && $_GET['post_type'] == WCPT_POST_TYPE_ID ) : ?> 478 } 479 } 480 481 /** 482 * admin_head () 483 * 484 * Add some general styling to the admin area 485 */ 486 function admin_head() { 487 if ( ! empty( $_GET['post_type'] ) && $_GET['post_type'] == WCPT_POST_TYPE_ID ) : ?> 617 488 618 489 .column-title { width: 40%; } 619 490 .column-wcpt_location, .column-wcpt_date, column-wcpt_organizer { white-space: nowrap; } 620 491 621 <?php endif; 622 } 623 624 /** 625 * user_profile_update () 626 * 627 * Responsible for showing additional profile options and settings 628 * 629 * @todo Everything 630 */ 631 function user_profile_update( $user_id ) { 632 if ( !wcpt_has_access() ) 633 return false; 634 } 635 636 /** 637 * user_profile_wordcamp () 638 * 639 * Responsible for saving additional profile options and settings 640 * 641 * @todo Everything 642 */ 643 function user_profile_wordcamp( $profileuser ) { 644 if ( !wcpt_has_access() ) 645 return false; 646 ?> 492 <?php 493 endif; 494 } 495 496 /** 497 * user_profile_update () 498 * 499 * Responsible for showing additional profile options and settings 500 * 501 * @todo Everything 502 */ 503 function user_profile_update( $user_id ) { 504 if ( ! wcpt_has_access() ) { 505 return false; 506 } 507 } 508 509 /** 510 * user_profile_wordcamp () 511 * 512 * Responsible for saving additional profile options and settings 513 * 514 * @todo Everything 515 */ 516 function user_profile_wordcamp( $profileuser ) { 517 if ( ! wcpt_has_access() ) { 518 return false; 519 } 520 ?> 647 521 648 522 <h3><?php _e( 'WordCamps', 'wcpt' ); ?></h3> … … 657 531 </table> 658 532 659 <?php 660 } 661 662 /** 663 * column_headers () 664 * 665 * Manage the column headers 666 * 667 * @param array $columns 668 * @return array $columns 669 */ 670 function column_headers( $columns ) { 671 $columns = array ( 672 'cb' => '<input type="checkbox" />', 673 'title' => __( 'Title', 'wcpt' ), 674 //'wcpt_location' => __( 'Location', 'wcpt' ), 675 'wcpt_date' => __( 'Date', 'wcpt' ), 676 'wcpt_organizer' => __( 'Organizer', 'wcpt' ), 677 'wcpt_venue' => __( 'Venue', 'wcpt' ), 678 'date' => __( 'Status', 'wcpt' ) 679 ); 680 return $columns; 681 } 682 683 /** 684 * Display the status of a WordCamp post 685 * 686 * @param array $states 687 * 688 * @return array 689 */ 690 public function display_post_states( $states ) { 691 global $post; 692 693 if ( $post->post_type != WCPT_POST_TYPE_ID ) { 694 return $states; 695 } 696 697 $status = get_post_status_object( $post->post_status ); 698 if ( get_query_var( 'post_status' ) != $post->post_status ) { 699 $states[ $status->name ] = $status->label; 700 } 701 702 return $states; 703 } 704 705 /** 706 * column_data ( $column, $post_id ) 707 * 708 * Print extra columns 709 * 710 * @param string $column 711 * @param int $post_id 712 */ 713 function column_data( $column, $post_id ) { 714 if ( $_GET['post_type'] !== WCPT_POST_TYPE_ID ) 715 return $column; 716 717 switch ( $column ) { 718 case 'wcpt_location' : 719 echo wcpt_get_wordcamp_location() ? wcpt_get_wordcamp_location() : __( 'No Location', 'wcpt' ); 720 break; 721 722 case 'wcpt_date' : 723 // Has a start date 724 if ( $start = wcpt_get_wordcamp_start_date() ) { 725 726 // Has an end date 727 if ( $end = wcpt_get_wordcamp_end_date() ) { 728 $string_date = sprintf( __( 'Start: %1$s<br />End: %2$s', 'wcpt' ), $start, $end ); 729 730 // No end date 533 <?php 534 } 535 536 /** 537 * column_headers () 538 * 539 * Manage the column headers 540 * 541 * @param array $columns 542 * @return array $columns 543 */ 544 function column_headers( $columns ) { 545 $columns = array( 546 'cb' => '<input type="checkbox" />', 547 'title' => __( 'Title', 'wcpt' ), 548 // 'wcpt_location' => __( 'Location', 'wcpt' ), 549 'wcpt_date' => __( 'Date', 'wcpt' ), 550 'wcpt_organizer' => __( 'Organizer', 'wcpt' ), 551 'wcpt_venue' => __( 'Venue', 'wcpt' ), 552 'date' => __( 'Status', 'wcpt' ), 553 ); 554 return $columns; 555 } 556 557 /** 558 * column_data ( $column, $post_id ) 559 * 560 * Print extra columns 561 * 562 * @param string $column 563 * @param int $post_id 564 */ 565 function column_data( $column, $post_id ) { 566 if ( $_GET['post_type'] !== WCPT_POST_TYPE_ID ) { 567 return $column; 568 } 569 570 switch ( $column ) { 571 case 'wcpt_location': 572 echo wcpt_get_wordcamp_location() ? wcpt_get_wordcamp_location() : __( 'No Location', 'wcpt' ); 573 break; 574 575 case 'wcpt_date': 576 // Has a start date 577 if ( $start = wcpt_get_wordcamp_start_date() ) { 578 579 // Has an end date 580 if ( $end = wcpt_get_wordcamp_end_date() ) { 581 $string_date = sprintf( __( 'Start: %1$s<br />End: %2$s', 'wcpt' ), $start, $end ); 582 583 // No end date 584 } else { 585 $string_date = sprintf( __( 'Start: %1$s', 'wcpt' ), $start ); 586 } 587 588 // No date 731 589 } else { 732 $string_date = sprintf( __( 'Start: %1$s', 'wcpt' ), $start);590 $string_date = __( 'No Date', 'wcpt' ); 733 591 } 734 592 735 // No date 736 } else { 737 $string_date = __( 'No Date', 'wcpt' ); 738 } 739 740 echo $string_date; 741 break; 742 743 case 'wcpt_organizer' : 744 echo wcpt_get_wordcamp_organizer_name() ? wcpt_get_wordcamp_organizer_name() : __( 'No Organizer', 'wcpt' ); 745 break; 746 747 case 'wcpt_venue' : 748 echo wcpt_get_wordcamp_venue_name() ? wcpt_get_wordcamp_venue_name() : __( 'No Venue', 'wcpt' ); 749 break; 750 } 751 } 752 753 /** 754 * post_row_actions ( $actions, $post ) 755 * 756 * Remove the quick-edit action link and display the description under 757 * 758 * @param array $actions 759 * @param array $post 760 * @return array $actions 761 */ 762 function post_row_actions( $actions, $post ) { 763 if ( WCPT_POST_TYPE_ID == $post->post_type ) { 764 unset( $actions['inline hide-if-no-js'] ); 765 766 $wc = array(); 767 768 if ( $wc_location = wcpt_get_wordcamp_location() ) 769 $wc['location'] = $wc_location; 770 771 if ( $wc_url = make_clickable( wcpt_get_wordcamp_url() ) ) 772 $wc['url'] = $wc_url; 773 774 echo implode( ' - ', (array) $wc ); 775 } 776 777 return $actions; 778 } 779 780 /** 781 * Trigger actions related to WordCamps being scheduled. 782 * 783 * @param string $new_status 784 * @param string $old_status 785 * @param WP_Post $post 786 */ 787 public function trigger_schedule_actions( $new_status, $old_status, $post ) { 788 if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type ) { 789 return; 790 } 791 792 if ( $new_status == $old_status ) { 793 return; 794 } 795 796 if ( 'wcpt-pre-planning' == $new_status ) { 797 do_action( 'wcpt_approved_for_pre_planning', $post ); 798 } elseif ( $old_status == 'wcpt-needs-schedule' && $new_status == 'wcpt-scheduled' ) { 799 do_action( 'wcpt_added_to_final_schedule', $post ); 800 } 801 802 // todo add new triggers - which ones? 803 } 804 805 /** 806 * Log when the post status changes 807 * 808 * @param string $new_status 809 * @param string $old_status 810 * @param WP_Post $post 811 */ 812 public function log_status_changes( $new_status, $old_status, $post ) { 813 if ( $new_status === $old_status || $new_status == 'auto-draft' ) { 814 return; 815 } 816 817 if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type ) { 818 return; 819 } 820 821 $old_status = get_post_status_object( $old_status ); 822 $new_status = get_post_status_object( $new_status ); 823 824 add_post_meta( $post->ID, '_status_change', array( 825 'timestamp' => time(), 826 'user_id' => get_current_user_id(), 827 'message' => sprintf( '%s → %s', $old_status->label, $new_status->label ), 828 ) ); 829 } 830 831 /** 832 * Add the lead organizer to Central when a WordCamp application is accepted. 833 * 834 * Adding the lead organizer to Central allows them to enter all the `wordcamp` 835 * meta info themselves, and also post updates to the Central blog. 836 * 837 * @param WP_Post $post 838 */ 839 public function add_organizer_to_central( $post ) { 840 $lead_organizer = get_user_by( 'login', $_POST['wcpt_wordpress_org_username'] ); 841 842 if ( $lead_organizer && add_user_to_blog( get_current_blog_id(), $lead_organizer->ID, 'contributor' ) ) { 843 do_action( 'wcor_organizer_added_to_central', $post ); 844 } 845 } 846 847 /** 848 * Record when the WordCamp was added to the planning schedule. 849 * 850 * This is used by the Organizer Reminders plugin to send automated e-mails at certain points after the camp 851 * has been added to the planning schedule. 852 * 853 * @param WP_Post $wordcamp 854 */ 855 public function mark_date_added_to_planning_schedule( $wordcamp ) { 856 update_post_meta( $wordcamp->ID, '_timestamp_added_to_planning_schedule', time() ); 857 } 858 859 /** 860 * Enforce a valid post status for WordCamps. 861 * 862 * @param array $post_data 863 * @param array $post_data_raw 864 * @return array 865 */ 866 public function enforce_post_status( $post_data, $post_data_raw ) { 867 if ( $post_data['post_type'] != WCPT_POST_TYPE_ID || empty( $_POST['post_ID'] ) ) { 593 echo $string_date; 594 break; 595 596 case 'wcpt_organizer': 597 echo wcpt_get_wordcamp_organizer_name() ? wcpt_get_wordcamp_organizer_name() : __( 'No Organizer', 'wcpt' ); 598 break; 599 600 case 'wcpt_venue': 601 echo wcpt_get_wordcamp_venue_name() ? wcpt_get_wordcamp_venue_name() : __( 'No Venue', 'wcpt' ); 602 break; 603 } 604 } 605 606 /** 607 * post_row_actions ( $actions, $post ) 608 * 609 * Remove the quick-edit action link and display the description under 610 * 611 * @param array $actions 612 * @param array $post 613 * @return array $actions 614 */ 615 function post_row_actions( $actions, $post ) { 616 if ( WCPT_POST_TYPE_ID == $post->post_type ) { 617 unset( $actions['inline hide-if-no-js'] ); 618 619 $wc = array(); 620 621 if ( $wc_location = wcpt_get_wordcamp_location() ) { 622 $wc['location'] = $wc_location; 623 } 624 625 if ( $wc_url = make_clickable( wcpt_get_wordcamp_url() ) ) { 626 $wc['url'] = $wc_url; 627 } 628 629 echo implode( ' - ', (array) $wc ); 630 } 631 632 return $actions; 633 } 634 635 /** 636 * Trigger actions related to WordCamps being scheduled. 637 * 638 * @param string $new_status 639 * @param string $old_status 640 * @param WP_Post $post 641 */ 642 public function trigger_schedule_actions( $new_status, $old_status, $post ) { 643 if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type ) { 644 return; 645 } 646 647 if ( $new_status == $old_status ) { 648 return; 649 } 650 651 if ( 'wcpt-pre-planning' == $new_status ) { 652 do_action( 'wcpt_approved_for_pre_planning', $post ); 653 } elseif ( $old_status == 'wcpt-needs-schedule' && $new_status == 'wcpt-scheduled' ) { 654 do_action( 'wcpt_added_to_final_schedule', $post ); 655 } 656 657 // todo add new triggers - which ones? 658 } 659 660 661 /** 662 * Add the lead organizer to Central when a WordCamp application is accepted. 663 * 664 * Adding the lead organizer to Central allows them to enter all the `wordcamp` 665 * meta info themselves, and also post updates to the Central blog. 666 * 667 * @param WP_Post $post 668 */ 669 public function add_organizer_to_central( $post ) { 670 $lead_organizer = get_user_by( 'login', $_POST['wcpt_wordpress_org_username'] ); 671 672 if ( $lead_organizer && add_user_to_blog( get_current_blog_id(), $lead_organizer->ID, 'contributor' ) ) { 673 do_action( 'wcor_organizer_added_to_central', $post ); 674 } 675 } 676 677 /** 678 * Record when the WordCamp was added to the planning schedule. 679 * 680 * This is used by the Organizer Reminders plugin to send automated e-mails at certain points after the camp 681 * has been added to the planning schedule. 682 * 683 * @param WP_Post $wordcamp 684 */ 685 public function mark_date_added_to_planning_schedule( $wordcamp ) { 686 update_post_meta( $wordcamp->ID, '_timestamp_added_to_planning_schedule', time() ); 687 } 688 689 /** 690 * Enforce a valid post status for WordCamps. 691 * 692 * @param array $post_data 693 * @param array $post_data_raw 694 * @return array 695 */ 696 public function enforce_post_status( $post_data, $post_data_raw ) { 697 if ( $post_data['post_type'] != WCPT_POST_TYPE_ID || empty( $_POST['post_ID'] ) ) { 698 return $post_data; 699 } 700 701 $post = get_post( $_POST['post_ID'] ); 702 if ( ! $post ) { 703 return $post_data; 704 } 705 706 if ( ! empty( $post_data['post_status'] ) ) { 707 $wcpt = get_post_type_object( WCPT_POST_TYPE_ID ); 708 709 // Only WordCamp Wranglers can change WordCamp statuses. 710 if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) { 711 $post_data['post_status'] = $post->post_status; 712 } 713 714 // Enforce a valid status. 715 $statuses = array_keys( WordCamp_Loader::get_post_statuses() ); 716 $statuses = array_merge( $statuses, array( 'trash' ) ); 717 718 if ( ! in_array( $post_data['post_status'], $statuses ) ) { 719 $post_data['post_status'] = $statuses[0]; 720 } 721 } 722 868 723 return $post_data; 869 724 } 870 725 871 $post = get_post( $_POST['post_ID'] ); 872 if ( ! $post ) { 726 /** 727 * Prevent WordCamp posts from being set to pending or published until all the required fields are completed. 728 * 729 * @param array $post_data 730 * @param array $post_data_raw 731 * @return array 732 */ 733 public function require_complete_meta_to_publish_wordcamp( $post_data, $post_data_raw ) { 734 if ( WCPT_POST_TYPE_ID != $post_data['post_type'] ) { 735 return $post_data; 736 } 737 738 // The ID of the last site that was created before this rule went into effect, so that we don't apply the rule retroactively. 739 $min_site_id = apply_filters( 'wcpt_require_complete_meta_min_site_id', '2416297' ); 740 741 $required_needs_site_fields = $this->get_required_fields( 'needs-site' ); 742 $required_scheduled_fields = $this->get_required_fields( 'scheduled' ); 743 744 // Check pending posts 745 if ( 'wcpt-needs-site' == $post_data['post_status'] && absint( $_POST['post_ID'] ) > $min_site_id ) { 746 foreach ( $required_needs_site_fields as $field ) { 747 $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ]; 748 749 if ( empty( $value ) || 'null' == $value ) { 750 $post_data['post_status'] = 'wcpt-needs-email'; 751 $this->active_admin_notices[] = 1; 752 break; 753 } 754 } 755 } 756 757 // Check published posts 758 if ( 'wcpt-scheduled' == $post_data['post_status'] && isset( $_POST['post_ID'] ) && absint( $_POST['post_ID'] ) > $min_site_id ) { 759 foreach ( $required_scheduled_fields as $field ) { 760 $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ]; 761 762 if ( empty( $value ) || 'null' == $value ) { 763 $post_data['post_status'] = 'wcpt-needs-schedule'; 764 $this->active_admin_notices[] = 3; 765 break; 766 } 767 } 768 } 769 873 770 return $post_data; 874 771 } 875 772 876 if ( ! empty( $post_data['post_status'] ) ) { 877 $wcpt = get_post_type_object( WCPT_POST_TYPE_ID ); 878 879 // Only WordCamp Wranglers can change WordCamp statuses. 773 /** 774 * Get a list of fields required to move to a certain post status 775 * 776 * @param string $status 'needs-site' | 'scheduled' | 'any' 777 * 778 * @return array 779 */ 780 public static function get_required_fields( $status ) { 781 $needs_site = array( 'E-mail Address' ); 782 783 $scheduled = array( 784 // WordCamp 785 'Start Date (YYYY-mm-dd)', 786 'Location', 787 'URL', 788 'E-mail Address', 789 'Number of Anticipated Attendees', 790 'Multi-Event Sponsor Region', 791 792 // Organizing Team 793 'Organizer Name', 794 'WordPress.org Username', 795 'Email Address', 796 'Telephone', 797 'Mailing Address', 798 'Sponsor Wrangler Name', 799 'Sponsor Wrangler E-mail Address', 800 'Budget Wrangler Name', 801 'Budget Wrangler E-mail Address', 802 803 // Venue 804 'Physical Address', // used to build stats 805 ); 806 807 switch ( $status ) { 808 case 'needs-site': 809 $required_fields = $needs_site; 810 break; 811 812 case 'scheduled': 813 $required_fields = $scheduled; 814 break; 815 816 case 'any': 817 default: 818 $required_fields = array_merge( $needs_site, $scheduled ); 819 break; 820 } 821 822 return $required_fields; 823 } 824 825 public static function get_protected_fields() { 826 $protected_fields = array(); 827 828 if ( ! current_user_can( 'wordcamp_manage_mentors' ) ) { 829 $protected_fields = array_merge( 830 $protected_fields, array( 831 'Mentor WordPress.org User Name', 832 'Mentor Name', 833 'Mentor E-mail Address', 834 ) 835 ); 836 } 837 880 838 if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) { 881 $post_data['post_status'] = $post->post_status; 882 } 883 884 // Enforce a valid status. 885 $statuses = array_keys( WordCamp_Loader::get_post_statuses() ); 886 $statuses = array_merge( $statuses, array( 'trash' ) ); 887 888 if ( ! in_array( $post_data['post_status'], $statuses ) ) { 889 $post_data['post_status'] = $statuses[0]; 890 } 891 } 892 893 return $post_data; 894 } 895 896 /** 897 * Prevent WordCamp posts from being set to pending or published until all the required fields are completed. 898 * 899 * @param array $post_data 900 * @param array $post_data_raw 901 * @return array 902 */ 903 public function require_complete_meta_to_publish_wordcamp( $post_data, $post_data_raw ) { 904 if ( WCPT_POST_TYPE_ID != $post_data['post_type'] ) { 905 return $post_data; 906 } 907 908 // The ID of the last site that was created before this rule went into effect, so that we don't apply the rule retroactively. 909 $min_site_id = apply_filters( 'wcpt_require_complete_meta_min_site_id', '2416297' ); 910 911 $required_needs_site_fields = $this->get_required_fields( 'needs-site' ); 912 $required_scheduled_fields = $this->get_required_fields( 'scheduled' ); 913 914 // Check pending posts 915 if ( 'wcpt-needs-site' == $post_data['post_status'] && absint( $_POST['post_ID'] ) > $min_site_id ) { 916 foreach( $required_needs_site_fields as $field ) { 917 $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ]; 918 919 if ( empty( $value ) || 'null' == $value ) { 920 $post_data['post_status'] = 'wcpt-needs-email'; 921 $this->active_admin_notices[] = 1; 922 break; 923 } 924 } 925 } 926 927 // Check published posts 928 if ( 'wcpt-scheduled' == $post_data['post_status'] && isset( $_POST['post_ID'] ) && absint( $_POST['post_ID'] ) > $min_site_id ) { 929 foreach( $required_scheduled_fields as $field ) { 930 $value = $_POST[ wcpt_key_to_str( $field, 'wcpt_' ) ]; 931 932 if ( empty( $value ) || 'null' == $value ) { 933 $post_data['post_status'] = 'wcpt-needs-schedule'; 934 $this->active_admin_notices[] = 3; 935 break; 936 } 937 } 938 } 939 940 return $post_data; 941 } 942 943 /** 944 * Get a list of fields required to move to a certain post status 945 * 946 * @param string $status 'needs-site' | 'scheduled' | 'any' 947 * 948 * @return array 949 */ 950 public static function get_required_fields( $status ) { 951 $needs_site = array( 'E-mail Address' ); 952 953 $scheduled = array( 954 // WordCamp 955 'Start Date (YYYY-mm-dd)', 956 'Location', 957 'URL', 958 'E-mail Address', 959 'Number of Anticipated Attendees', 960 'Multi-Event Sponsor Region', 961 962 // Organizing Team 963 'Organizer Name', 964 'WordPress.org Username', 965 'Email Address', 966 'Telephone', 967 'Mailing Address', 968 'Sponsor Wrangler Name', 969 'Sponsor Wrangler E-mail Address', 970 'Budget Wrangler Name', 971 'Budget Wrangler E-mail Address', 972 973 // Venue 974 'Physical Address' // used to build stats 975 ); 976 977 switch ( $status ) { 978 case 'needs-site': 979 $required_fields = $needs_site; 980 break; 981 982 case 'scheduled': 983 $required_fields = $scheduled; 984 break; 985 986 case 'any': 987 default: 988 $required_fields = array_merge( $needs_site, $scheduled ); 989 break; 990 } 991 992 return $required_fields; 993 } 994 995 /** 996 * Check if a field should be readonly, based on the current user's caps. 997 * 998 * @param string $field_name The field to check. 999 * 1000 * @return bool 1001 */ 1002 public static function is_protected_field( $field_name ) { 1003 $protected_fields = array(); 1004 1005 if ( ! current_user_can( 'wordcamp_manage_mentors' ) ) { 1006 $protected_fields = array_merge( $protected_fields, array( 1007 'Mentor WordPress.org User Name', 1008 'Mentor Name', 1009 'Mentor E-mail Address', 1010 ) ); 1011 } 1012 1013 if ( ! current_user_can( 'wordcamp_wrangle_wordcamps' ) ) { 1014 $protected_fields = array_merge( $protected_fields, array( 1015 'Multi-Event Sponsor Region', 1016 ) ); 1017 } 1018 1019 return in_array( $field_name, $protected_fields ); 1020 } 1021 1022 /** 1023 * Add our custom admin notice keys to the redirect URL. 1024 * 1025 * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should 1026 * be shown when the redirect finished. When it does, print_admin_notices() will examine the URL and create 1027 * a notice with the message that corresponds to the key. 1028 * 1029 * @param $location 1030 * @param $post_id 1031 * @return string 1032 */ 1033 public function add_admin_notices_to_redirect_url( $location, $post_id ) { 1034 if ( $this->active_admin_notices ) { 1035 $location = add_query_arg( 'wcpt_messages', implode( ',', $this->active_admin_notices ), $location ); 1036 } 1037 1038 // Don't show conflicting messages like 'Post submitted.' 1039 if ( in_array( 1, $this->active_admin_notices ) && false !== strpos( $location, 'message=8' ) ) { 1040 $location = remove_query_arg( 'message', $location ); 1041 } 1042 1043 return $location; 1044 } 1045 1046 /** 1047 * Create admin notices for messages that were passed in the URL. 1048 * 1049 * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should 1050 * be shown when the redirect finished. add_admin_notices_to_redirect_url() adds those keys to the redirect 1051 * url, and this function examines the URL and create a notice with the message that corresponds to the key. 1052 * 1053 * $notices[key]['type'] should equal 'error' or 'updated'. 1054 */ 1055 public function print_admin_notices() { 1056 global $post; 1057 $screen = get_current_screen(); 1058 1059 if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type || 'post' !== $screen->base ) { 1060 return; 1061 } 1062 1063 $notices = array( 1064 1 => array( 1065 'type' => 'error', 1066 'notice' => sprintf( 1067 __( 'This WordCamp cannot be moved to Needs Site until all of its required metadata is filled in: %s.', 'wordcamporg' ), 1068 implode( ', ', $this->get_required_fields( 'needs-site' ) ) 839 $protected_fields = array_merge( 840 $protected_fields, array( 841 'Multi-Event Sponsor Region', 842 ) 843 ); 844 } 845 846 return $protected_fields; 847 } 848 849 /** 850 * Check if a field should be readonly, based on the current user's caps. 851 * 852 * @param string $field_name The field to check. 853 * 854 * @return bool 855 */ 856 public static function is_protected_field( $field_name ) { 857 858 $protected_fields = self::get_protected_fields(); 859 860 return in_array( $field_name, $protected_fields ); 861 } 862 863 /** 864 * Add our custom admin notice keys to the redirect URL. 865 * 866 * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should 867 * be shown when the redirect finished. When it does, print_admin_notices() will examine the URL and create 868 * a notice with the message that corresponds to the key. 869 * 870 * @param $location 871 * @param $post_id 872 * @return string 873 */ 874 public function add_admin_notices_to_redirect_url( $location, $post_id ) { 875 if ( $this->active_admin_notices ) { 876 $location = add_query_arg( 'wcpt_messages', implode( ',', $this->active_admin_notices ), $location ); 877 } 878 879 // Don't show conflicting messages like 'Post submitted.' 880 if ( in_array( 1, $this->active_admin_notices ) && false !== strpos( $location, 'message=8' ) ) { 881 $location = remove_query_arg( 'message', $location ); 882 } 883 884 return $location; 885 } 886 887 /** 888 * Create admin notices for messages that were passed in the URL. 889 * 890 * Any member can add a key to $this->active_admin_notices to signify that the corresponding message should 891 * be shown when the redirect finished. add_admin_notices_to_redirect_url() adds those keys to the redirect 892 * url, and this function examines the URL and create a notice with the message that corresponds to the key. 893 * 894 * $notices[key]['type'] should equal 'error' or 'updated'. 895 */ 896 public function print_admin_notices() { 897 global $post; 898 $screen = get_current_screen(); 899 900 if ( empty( $post->post_type ) || WCPT_POST_TYPE_ID != $post->post_type || 'post' !== $screen->base ) { 901 return; 902 } 903 904 $notices = array( 905 1 => array( 906 'type' => 'error', 907 'notice' => sprintf( 908 __( 'This WordCamp cannot be moved to Needs Site until all of its required metadata is filled in: %s.', 'wordcamporg' ), 909 implode( ', ', $this->get_required_fields( 'needs-site' ) ) 910 ), 1069 911 ), 1070 ), 1071 1072 3 => array(1073 'type' => 'error',1074 'notice' => sprintf(1075 __( 'This WordCamp cannot be added to the schedule until all of its required metadata is filled in: %s.', 'wordcamporg' ),1076 implode( ', ', $this->get_required_fields( 'scheduled' ) )912 913 3 => array( 914 'type' => 'error', 915 'notice' => sprintf( 916 __( 'This WordCamp cannot be added to the schedule until all of its required metadata is filled in: %s.', 'wordcamporg' ), 917 implode( ', ', $this->get_required_fields( 'scheduled' ) ) 918 ), 1077 919 ), 1078 ), 1079 1080 4 => array( 1081 'type' => 'error', 1082 'notice' => __( 'The physical address could not be geocoded, which prevents the camp from showing up in the Events Widget. Please tweak the address so that Google can parse it.', 'wordcamporg' ) 1083 ), 1084 ); 1085 1086 // Show this error permenantly, not just after updating. 1087 if ( ! empty( $post->{'Physical Address'} ) && empty( get_post_meta( $post->ID, '_venue_coordinates', true ) ) ) { 1088 $_REQUEST['wcpt_messages'] = empty( $_REQUEST['wcpt_messages'] ) ? '4' : $_REQUEST['wcpt_messages'] . ',4'; 1089 } 1090 1091 if ( ! empty( $_REQUEST['wcpt_messages'] ) ) { 1092 $active_notices = explode( ',', $_REQUEST['wcpt_messages'] ); 1093 1094 foreach ( $active_notices as $notice_key ) { 1095 if ( isset( $notices[ $notice_key ] ) ) { 1096 ?> 920 921 4 => array( 922 'type' => 'error', 923 'notice' => __( 'The physical address could not be geocoded, which prevents the camp from showing up in the Events Widget. Please tweak the address so that Google can parse it.', 'wordcamporg' ), 924 ), 925 ); 926 927 // Show this error permenantly, not just after updating. 928 if ( ! empty( $post->{'Physical Address'} ) && empty( get_post_meta( $post->ID, '_venue_coordinates', true ) ) ) { 929 $_REQUEST['wcpt_messages'] = empty( $_REQUEST['wcpt_messages'] ) ? '4' : $_REQUEST['wcpt_messages'] . ',4'; 930 } 931 932 if ( ! empty( $_REQUEST['wcpt_messages'] ) ) { 933 $active_notices = explode( ',', $_REQUEST['wcpt_messages'] ); 934 935 foreach ( $active_notices as $notice_key ) { 936 if ( isset( $notices[ $notice_key ] ) ) { 937 ?> 1097 938 1098 939 <div class="<?php echo esc_attr( $notices[ $notice_key ]['type'] ); ?>"> … … 1100 941 </div> 1101 942 1102 <?php 1103 } 943 <?php 944 } 945 } 946 } 947 } 948 949 /** 950 * Get list of valid status transitions from given status 951 * 952 * @param string $status 953 * 954 * @return array 955 */ 956 public static function get_valid_status_transitions( $status ) { 957 return WordCamp_Loader::get_valid_status_transitions( $status ); 958 } 959 960 /** 961 * Get list of all available post statuses. 962 * 963 * @return array 964 */ 965 public static function get_post_statuses() { 966 return WordCamp_Loader::get_post_statuses(); 967 } 968 969 /** 970 * Capability required to edit wordcamp posts 971 * 972 * @return string 973 */ 974 public static function get_edit_capability() { 975 return 'wordcamp_wrangle_wordcamps'; 976 } 977 978 /** 979 * Schedule cron jobs 980 */ 981 public function schedule_cron_jobs() { 982 if ( wp_next_scheduled( 'wcpt_close_wordcamps_after_event' ) ) { 983 return; 984 } 985 986 wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'wcpt_close_wordcamps_after_event' ); 987 } 988 989 /** 990 * Set WordCamp posts to the Closed status after the event is over 991 */ 992 public function close_wordcamps_after_event() { 993 $scheduled_wordcamps = get_posts( 994 array( 995 'post_type' => WCPT_POST_TYPE_ID, 996 'post_status' => 'wcpt-scheduled', 997 'posts_per_page' => -1, 998 ) 999 ); 1000 1001 foreach ( $scheduled_wordcamps as $wordcamp ) { 1002 $start_date = get_post_meta( $wordcamp->ID, 'Start Date (YYYY-mm-dd)', true ); 1003 $end_date = get_post_meta( $wordcamp->ID, 'End Date (YYYY-mm-dd)', true ); 1004 1005 if ( empty( $start_date ) ) { 1006 continue; 1007 } 1008 1009 if ( empty( $end_date ) ) { 1010 $end_date = $start_date; 1011 } 1012 1013 $end_date_at_midnight = strtotime( '23:59', $end_date ); // $end_date is the date at time 00:00, but the event isn't over until 23:59 1014 1015 if ( $end_date_at_midnight > time() ) { 1016 continue; 1017 } 1018 1019 wp_update_post( 1020 array( 1021 'ID' => $wordcamp->ID, 1022 'post_status' => 'wcpt-closed', 1023 ) 1024 ); 1104 1025 } 1105 1026 } 1106 1027 } 1107 1108 /**1109 * Render the WordCamp status meta box.1110 */1111 public function metabox_status( $post ) {1112 require_once( WCPT_DIR . 'views/wordcamp/metabox-status.php' );1113 }1114 1115 /**1116 * Render the WordCamp status meta box.1117 */1118 public function original_application_metabox( $post ) {1119 $application_data = get_post_meta( $post->ID, '_application_data', true );1120 require_once( WCPT_DIR . 'views/wordcamp/metabox-original-application.php' );1121 }1122 1123 /**1124 * Schedule cron jobs1125 */1126 public function schedule_cron_jobs() {1127 if ( wp_next_scheduled( 'wcpt_close_wordcamps_after_event' ) ) {1128 return;1129 }1130 1131 wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'wcpt_close_wordcamps_after_event' );1132 }1133 1134 /**1135 * Set WordCamp posts to the Closed status after the event is over1136 */1137 public function close_wordcamps_after_event() {1138 $scheduled_wordcamps = get_posts( array(1139 'post_type' => WCPT_POST_TYPE_ID,1140 'post_status' => 'wcpt-scheduled',1141 'posts_per_page' => -11142 ) );1143 1144 foreach ( $scheduled_wordcamps as $wordcamp ) {1145 $start_date = get_post_meta( $wordcamp->ID, 'Start Date (YYYY-mm-dd)', true );1146 $end_date = get_post_meta( $wordcamp->ID, 'End Date (YYYY-mm-dd)', true );1147 1148 if ( empty( $start_date ) ) {1149 continue;1150 }1151 1152 if ( empty( $end_date ) ) {1153 $end_date = $start_date;1154 }1155 1156 $end_date_at_midnight = strtotime( '23:59', $end_date ); // $end_date is the date at time 00:00, but the event isn't over until 23:591157 1158 if ( $end_date_at_midnight > time() ) {1159 continue;1160 }1161 1162 wp_update_post( array(1163 'ID' => $wordcamp->ID,1164 'post_status' => 'wcpt-closed',1165 ) );1166 }1167 }1168 }1169 1028 endif; // class_exists check 1170 1029 … … 1215 1074 ); 1216 1075 1217 foreach ( $meta_keys as $key => $value ) : 1218 $object_name = wcpt_key_to_str( $key, 'wcpt_' ); 1219 $readonly = ( WordCamp_Admin::is_protected_field( $key ) ) ? ' readonly="readonly"' : ''; 1220 ?> 1221 1222 <div class="inside"> 1223 <?php if ( 'checkbox' == $value ) : ?> 1224 1225 <p> 1226 <strong><?php echo $key; ?></strong>: 1227 <input type="checkbox" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" <?php checked( get_post_meta( $post_id, $key, true ) ); ?><?php echo $readonly; ?> /> 1228 </p> 1229 1230 <?php else : ?> 1231 1232 <p> 1233 <strong><?php echo $key; ?></strong> 1234 <?php if ( in_array( $key, $required_fields, true ) ) : ?> 1235 <span class="description"><?php _e( '(required)', 'wordcamporg' ); ?></span> 1236 <?php endif; ?> 1237 </p> 1238 1239 <p> 1240 <label class="screen-reader-text" for="<?php echo $object_name; ?>"><?php echo $key; ?></label> 1241 1242 <?php switch ( $value ) : 1243 case 'text' : ?> 1244 1245 <input type="text" size="36" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" value="<?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?>"<?php echo $readonly; ?> /> 1246 1247 <?php break; 1248 case 'number' : ?> 1249 1250 <input type="number" size="16" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" value="<?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?>" step="any" min="0"<?php echo $readonly; ?> /> 1251 1252 <?php break; 1253 case 'date' : 1254 1255 // Quick filter on dates 1256 if ( $date = get_post_meta( $post_id, $key, true ) ) { 1257 $date = date( 'Y-m-d', $date ); 1258 } 1259 1260 ?> 1261 1262 <input type="text" size="36" class="date-field" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>" value="<?php echo $date; ?>"<?php echo $readonly; ?> /> 1263 1264 <?php break; 1265 case 'textarea' : ?> 1266 1267 <textarea rows="4" cols="23" name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>"<?php echo $readonly; ?>><?php echo esc_attr( get_post_meta( $post_id, $key, true ) ); ?></textarea> 1268 1269 <?php break; 1270 case 'select-currency' : 1271 $currencies = WordCamp_Budgets::get_currencies(); ?> 1272 1273 <?php if ( $readonly ) : 1274 $value = get_post_meta( $post_id, $key, true ); ?> 1275 <select name="<?php echo $object_name; ?>" id="<?php echo $object_name; ?>"<?php echo $readonly; ?>> 1276 <option value="<?php echo esc_attr( $value ); ?>" selected> 1277 <?php echo ( $value ) ? esc_html( $currencies[ $value ] . ' (' . $value . ')' ) : ''; ?> 1278 </option> 1279 </select> 1280 <?php else : ?> 1281 <select name="<?php echo esc_attr( $object_name ); ?>" id="<?php echo esc_attr( $object_name ); ?>" class="select-currency"> 1282 <?php foreach ( $currencies as $symbol => $name ) : ?> 1283 <option value="<?php echo esc_attr( $symbol ); ?>"<?php selected( $symbol, get_post_meta( $post_id, $key, true ) ); ?>> 1284 <?php echo ( $symbol ) ? esc_html( $name . ' (' . $symbol . ')' ) : ''; ?> 1285 </option> 1286 <?php endforeach; ?> 1287 </select> 1288 <?php endif; ?> 1289 1290 <?php break; 1291 1292 default: 1293 do_action( 'wcpt_metabox_value', $key, $value, $object_name ); 1294 break; 1295 1296 endswitch; ?> 1297 1298 <?php if ( ! empty( $messages[ $key ] ) ) : ?> 1299 <?php if ( 'textarea' == $value ) { echo '<br />'; } ?> 1300 1301 <span class="description"><?php echo esc_html( $messages[ $key ] ); ?></span> 1302 <?php endif; ?> 1303 </p> 1304 1305 <?php endif; ?> 1306 </div> 1307 1308 <?php endforeach; 1076 Event_Admin::display_meta_boxes( $required_fields, $meta_keys, $messages, $post_id, WordCamp_Admin::get_protected_fields() ); 1077 1309 1078 } -
sites/trunk/wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-wordcamp/wordcamp-loader.php
r6186 r7607 6 6 define( 'WCPT_DEFAULT_STATUS', 'wcpt-needs-vetting' ); 7 7 define( 'WCPT_FINAL_STATUS', 'wcpt-closed' ); 8 9 require_once WCPT_DIR . 'wcpt-event/class-event-loader.php'; 8 10 9 11 if ( ! class_exists( 'WordCamp_Loader' ) ) : … … 16 18 * 17 19 */ 18 class WordCamp_Loader {20 class WordCamp_Loader extends Event_Loader { 19 21 20 22 /** … … 22 24 */ 23 25 function __construct() { 24 add_action( 'plugins_loaded', array( $this, 'includes' ) ); 25 add_action( 'init', array( $this, 'register_post_types' ) ); 26 add_action( 'init', array( $this, 'register_post_capabilities' ) ); 27 add_action( 'init', array( $this, 'register_post_statuses' ) ); 28 add_filter( 'pre_get_posts', array( $this, 'query_public_statuses_on_archives' ) ); 26 parent::__construct(); 29 27 add_action( 'wp_insert_post_data', array( $this, 'set_scheduled_date' ) ); 30 28 add_filter( 'wordcamp_rewrite_rules', array( $this, 'wordcamp_rewrite_rules' ) ); … … 132 130 } 133 131 134 public function register_post_statuses() { 135 foreach ( self::get_post_statuses() as $key => $label ) { 136 register_post_status( $key, array( 137 'label' => $label, 138 'public' => true, 139 'label_count' => _nx_noop( 140 sprintf( '%s <span class="count">(%s)</span>', $label, '%s' ), 141 sprintf( '%s <span class="count">(%s)</span>', $label, '%s' ), 142 'wordcamporg' 143 ), 144 ) ); 145 } 146 } 147 148 /** 149 * Only query the public post statuses on WordCamp archives and feeds 150 * 151 * By default, any public post statuses are queried when the `post_status` parameter is not explicitly passed 152 * to WP_Query. This causes central.wordcamp.org/wordcamps/ and central.wordcamp.org/wordcamps/feed/ to display 153 * camps that are `needs-vetting`, etc, which is not desired. 154 * 155 * Another way to fix this would have been to register some of the posts statuses as `private`, but they're not 156 * consistently used in a public or private way, so that would have had more side effects. 157 * 158 * @param WP_Query $query 159 */ 160 public function query_public_statuses_on_archives( $query ) { 161 if ( ! $query->is_post_type_archive( WCPT_POST_TYPE_ID ) ) { 162 return; 163 } 164 165 if ( is_admin() ) { 166 return; 167 } 168 169 // Sort by the date it was added to the schedule. See WordCamp_Loader::set_scheduled_date() for details. 170 if ( '' === $query->get( 'orderby' ) ) { 171 $query->set( 'orderby', 'menu_order date' ); 172 } 173 174 if ( ! empty( $query->query_vars['post_status'] ) ) { 175 return; 176 } 177 178 $query->query_vars['post_status'] = self::get_public_post_statuses(); 179 } 132 180 133 181 134 /**
Note: See TracChangeset
for help on using the changeset viewer.