Úvodní stránka › Fórum podpory WordPressu › Problémy s WordPressem › Query v Metaboxu
Štítky: Contact form 7, metabox, wp_reset_postdata()
Zvolené téma obsahuje celkem 4 odpovědi. Do diskuze (2 účastníci) se naposledy zapojil uživatel adam23 a poslední změna je stará 10 let, 5 měsíců.
-
AutorPříspěvky
-
22. listopadu 2013 (14:30) #5308
Zdravím,
chtci si udělat v adminu metabox, ve kterém bude v roletce na výběr, jaký formulář (vytvořený pomocí pluginu Contact Fomr 7) se má k příspěvku přiřadit.
Vše se mi podařilo, až na jednu chybu, která se vždy projevuje u každého uložení příspěvku.
Ta chyba je v tom, že při ukládání mi to automaticky změní permalink a taky mi to přepíše metaboxy u pluginu all-in-one SEO. Jako přepisující data použije poslední řádek z query dotazu – viz kód níže.
Co dělám špatně?
<select name="contact" id="contact"> <?php $args = array( 'post_type' => 'wpcf7_contact_form', //'meta_key' => 'price_table', ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) { ?> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <option <?php echo "value='".$the_query->ID."'"; ?> <?php if(get_post_meta($id_prispevku, 'contact', true) == $the_query->ID){ echo " selected "; } ?>><?php echo the_title(); ?></option> <?php endwhile; } wp_reset_postdata(); wp_reset_query(); ?> </select>
22. listopadu 2013 (16:30) #16820Co vypisují hodnoty proměnných
$id_prispevku
a$the_query->ID
? Nemělo by tam být místo nich všude$post->ID
?24. listopadu 2013 (14:08) #16821Tak jsem pořádně progooglil fora a našel jsem, jak to obejít. Ono je v podstatě jedno, jestli ty proměné jsou nastavené, tak či jinak, dělá to prostě vždy, když se použije new query, a všichni si na fórech stěžují na špatné řešení a nefunkčnost v podobě wp_reset_postdata().
Takže jsem to vyřešil takto: použil jsem funkci get_results:
<?php global $wpdb; global $post; $originalpost = $post; $id_prispevku = $post->ID; $querydetails = " SELECT * FROM $wpdb->posts WHERE $wpdb->posts.post_type = 'wpcf7_contact_form' AND $wpdb->posts.post_status = 'publish' ORDER BY $wpdb->posts.post_date DESC "; $pageposts = $wpdb->get_results($querydetails, OBJECT); if ($pageposts) { foreach ($pageposts as $post) { setup_postdata($post); $postID = get_the_ID(); echo '<option value="'; echo $postID . '"'; echo selected($postID,get_post_meta($id_prispevku, 'contact', true),false); echo '>'; echo the_title(); echo '</option>'; } } $post = $originalpost; ?>
25. listopadu 2013 (20:14) #16822Funkce wp_reset_postdata() funguje (pokud vím) bez problémů. Spíše je občas špatně implementována, ale to by neměl být tento případ. Každopádně bych určitě nepoužíval dotazy do databáze, když můžete použít základní funkce WordPressu. Jak jsem psal výše, tak mohl být problém způsoben spíše špatnými proměnnými nebo nějakou jinou chybou. Ale na to bychom přišli, pokud byste nám ukázal celý kód (abychom ho mohli třeba vyzkoušet), protože vidíme pouze jeho část a už nevíme, zda posíláte správně proměnné, když se metabox ukládá, atd.
25. listopadu 2013 (22:54) #16823Jakou tedy základní funkci jsem měl místo dotazu do databáze použít? Ono nejde jen o tento kód, ale dělá to třeba i plugin Page Builder (siteorigin), který taky přepisuje permalink a metaboxy u pluginu all-in-one SEO.
Co jsem tak googlil, tak ten dotaz na databázi je jediné řešení, které mi chodilo.
V podstatě tady to je můj problém popsaný: ODKAZ
Pokud si do metaboxu hodím query dotaz, tak mi to přepíše metaboxy a (permalink). A na to jsem použil klasický loop, dle Codexu:
<?php // The Query $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_the_title() . '</li>'; } echo '</ul>'; } else { // no posts found } /* Restore original Post Data */ wp_reset_postdata();
Tu chybu to dělalo, i když jsem ty promenne vymazal a nechal samotny loop, takže těmi proměnnými to není.
-
AutorPříspěvky
Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.