Query v Metaboxu

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ů.

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (z celkem 5)
  • Autor
    Příspěvky
  • #5308

    adam23
    Participant

    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>
    #16820

    admin
    Keymaster
    Web

    Co vypisují hodnoty proměnných $id_prispevku a $the_query->ID? Nemělo by tam být místo nich všude $post->ID?

    #16821

    adam23
    Participant

    Tak 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; 
    ?>
    #16822

    admin
    Keymaster
    Web

    Funkce 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.

    #16823

    adam23
    Participant

    Jakou 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í.

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (z celkem 5)

Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.

WordPress – novinky, návody a zajímavosti