ACF Custom Query GET URL - PullRequest
       1

ACF Custom Query GET URL

0 голосов
/ 30 марта 2019

Итак, у меня есть пара пользовательских полей, использующих ACF. На них у меня есть поле с именем cd_location (группа -> повторитель -> выбрать).

Я создал шаблон страницы (на основе моего собственного рабочего архива), который должен возвращать ВСЕ курсы, содержащие местоположение Y (GET / xxx.com/?loc=YYY), но он не работает вообще, и я не не знаю почему. Может кто-нибудь посоветовать, пожалуйста?

На основе Динамических параметров $ _GET .

Мой топ php код:

global $post;
global $_GET;
$heading = get_field( 'heading', $post->ID );
$course_dates = get_field('course_dates', $post->ID);

Тогда у меня есть цикл:

<?php
                if ( have_posts() ) : 
                    $counter = 0;
                    while ( have_posts() ) : the_post(); ?>
                        <div class="one_half<?php echo ( ++$counter == 2 ) ? ' last_column' : ''; ?>">
                            <div class="break-link">
                                <?php
                                get_portfolio_item_thumbnail( $post->ID, '5', '528', '328', true );
                                ?>
                            </div>
                            <h4 class="cont-subtitles"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
                            <p class="excerpt"><?php echo excerpt(15); ?></p>
                        </div><!-- end one_half -->

                        <?php if ( $counter == 2 ) : ?>
                            <div class='clear'> </div>
                        <?php $counter = 0; 
                        endif;
                    endwhile;
                endif; ?>

Это на functions.php:

add_action( 'pre_get_posts', function( $query ) {
        if ( isset( $query->query_vars[ 'post_type' ] ) && $query->query_vars[ 'post_type' ] == 'e-kursus' && isset( $_GET[ 'loc' ] ) ) {
            $query->set( 'meta_key', 'cd_location' );
            $query->set( 'meta_value', sanitize_text_field( $_GET[ 'loc' ] ) );
        }
        return $query;
    } );

Возвращает фиктивный пост с названием страницы без полей из ACF

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Итак, в основном после WP 4.8.3 все перепуталось.

Решение было functions.php :

function my_posts_where( $where ) {
    global $wpdb;
    $where = str_replace(
              "meta_key = 'course_dates_%", 
              "meta_key LIKE 'course_dates_%",
              $wpdb->remove_placeholder_escape($where)
    );
    return $where;
}
add_filter('posts_where', 'my_posts_where');

Страница петли:

$args = array(
                    'numberposts'   => -1,
                    'post_type'     => 'e-kursus',
                    'post_status'   => 'publish',
                    'meta_query'    => array(
                        array(
                            'key'       => 'course_dates_%_cd_location',
                            'value'     => $location,
                            'compare'   => '='
                        )
                    )
                );

                $the_query = new WP_Query( $args );

В основном course_dates - это повторитель, а cd_location - поле, из которого мне нужно получить информацию.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 30 марта 2019

Я не уверен в причине вашей проблемы, но вот несколько вещей, которые могут помочь ...

Перед тем, как что-либо сделать, оберните $_GET['loc'] в функцию WordPress sanitize_text_field(), это поможет предотвратить любое внедрение скрипта. Смотрите примеры моего кода ниже.

Я бы затем переместил действие pre_get_posts в ваших темах functions.php file.

functions.php

<?php
    add_action( 'pre_get_posts', function( $query ) {
        if ( isset( $query->query_vars[ 'post_type' ] ) && $query->query_vars[ 'post_type' ] == 'e-kursus' && isset( $_GET[ 'loc' ] ) ) {
            $query->set( 'meta_key', 'cd_location' );
            $query->set( 'meta_value', sanitize_text_field( $_GET[ 'loc' ] ) );
        }
        return $query;
    } );
?>

А потом в шаблоне вашего архива у вас был незамкнутый тег (<p class="excerpt">). Я исправил ваш код, см. Ниже.

<?php if ( have_posts() ) : ?>
    <?php $i = 0; ?>
    <?php while ( have_posts() ) : the_post(); $i++; ?>
        <div class="one_half<?php echo $i == 2 ? ' last_column' : ''; ?>">
            <div class="break-link">
                <?php get_portfolio_item_thumbnail( get_the_ID(), '5', '528', '328', true ); ?>
            </div>
            <h4 class="cont-subtitles"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
            <p class="excerpt"><?php echo excerpt(15); ?></p>
        </div>

        <?php if ( $i % 2 == 0 ) : ?>
            <div class="clear"></div>
        <?php endif; ?>
    <?php endwhile; ?>
<?php endif; ?>
...