Атрибуты шорткода, которые запрашивают базу данных - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь создать короткий код, который возвращает список врачей, соответствующих специальности.

Пока что я могу получить базовый шорткод для возврата содержимого всей таблицы, но не могу получить его для запроса на основе строки атрибута.

Вот что у меня есть:

// Add Shortcode
function list_docs( $atts ) {

    // Attributes
    $atts = shortcode_atts(
        array(
            'specialty' => '',
        ),
        $atts,
        'doctors'
    );

    global $wpdb;
    $specialty = $atts['specialty'];
    $specget = $wpdb->prepare("SELECT * FROM doctors WHERE specialty = '%s'", $specialty);
    $specresults = $wpdb->get_results($specget);

    foreach($specresults as $details) {
        echo $details;
    }

}
add_shortcode( 'doctors', 'list_docs' );

Если я запрашиваю базу данных напрямую:

SELECT * FROM `doctors` WHERE `specialty` = 'cardiology'

Я получаю ожидаемый результат.

Я пытаюсь вызвать его с помощью [doctors specialty="cardiology"] (я пробовал двойные и одинарные кавычки) на странице WordPress.

Прямо сейчас я не знаю, чего не знаю. Я не уверен, что я ввел что-то неправильно, имею опечатку, или пропускаю строку кода. Любая помощь будет потрясающей.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Может быть проблема не в запросе вообще, если предположить, что имя вашей таблицы действительно doctors (а не wp_doctors или что-то в этом роде)

$specresults будет содержать массив объектов.Допустим, ваша таблица doctors имеет столбец name, тогда вам могут подойти следующие изменения.


function list_docs( $atts ) {

    // Attributes
    $atts = shortcode_atts(
        array(
            'specialty' => '',
        ),
        $atts,
        'doctors'
    );

    global $wpdb;
    $specialty   = $atts['specialty'];
    $specget     = $wpdb->prepare( 'SELECT * FROM doctors WHERE specialty = %s', $specialty );
    $specresults = $wpdb->get_results( $specget );

    if ( $specresults ) {
        $doctor_names = array_map(
            function( $doctor_object ) {
                return $doctor_object->name;
            },
            $specresults
        );
        return implode( ', ', $doctor_names );
    }

    return '';

}
add_shortcode( 'doctors', 'list_docs' );

Несколько вещей, которые следует иметь в виду: -

  1. Короткие коды всегда должны возвращаться, а не отражаться напрямую.

  2. Запрос только необходимых данных из базы данных, насколько это возможно, вместо выполнения *

  3. Если выпотребуется только один столбец, предпочтительнее использовать метод get_col для $wpdb вместо get_results.
0 голосов
/ 17 апреля 2019

Пожалуйста, попробуйте с этим -

function list_docs( $atts ) {

    global $wpdb;
        $specialty = $atts['specialty'];
        $specget = $wpdb->prepare("SELECT * FROM doctors WHERE specialty = %s", $specialty);
        $specresults = $wpdb->get_results($specget);

        foreach($specresults as $details) {
        echo $details;
    }

}
add_shortcode( 'doctors', 'list_docs' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...