Получить вложение по значению мета-ключа


Мне нужно получить вложение (будет только по одному на публикацию), связанное с публикацией с помощью meta_key wpcf-legislacion-gratis (не имеет значения, какое значение имеет столбец), используя пользовательский запрос с использованием функции get_posts(). Я пробовал это двумя способами:

$nonActivePlan_args   = array(
    'order'           => 'desc',
    'meta_query'          => array(
            array(
                'key'     => 'wpcf-legislacion-gratis',
                'value'   => NULL,
                'compare' => '!='
            )
    ),
    'post_status'         => 'inherit',
    'posts_per_page'      => 1,
    'post_type'   => 'attachment',
    'post_parent' => get_the_ID(),
);

$nonActivePlanAttachment = get_posts( $nonActivePlan_args );
if ($nonActivePlanAttachment) {
    foreach ($nonActivePlanAttachment as $attachment) { ?>
        <div class="legislacion-ico">
            <a class="pdf" href="<?php echo wp_get_attachment_url( $attachment->ID, true ); ?>">
                <img src="<?php echo get_template_directory_uri(); ?>/images/ico_descargas.png">
                <br>
                Descargar PDF
            </a>
        </div>
    <?php
    }
}

wp_reset_postdata();

В связи с вышеприведенным у меня есть следующие сомнения:

  • Как мне написать запрос для поиска вложения с помощью meta_key, равного wpcf-legislacion-gratis, независимо от того, какие значения он имеет?
  • Является ли цикл в этом случае правильным? Заметьте, я буду у меня есть только один wpcf-legislacion-gratis на пост, так что мне нужно зацикливаться на результатах? Не должно быть только одного?
  • Если я разделю оба вложения (как вы увидите в запросе в конце поста), должен ли я выполнить wp_reset_postdata()?

Я пробовал также этот код:

$nonActivePlan_args   = array(
    'order'             => 'desc',
    'meta_key'          => 'wpcf-legislacion-gratis',
    'post_status'       => 'inherit',
    'posts_per_page'    => 1,
    'post_type'         => 'attachment',
    'post_parent'       => get_the_ID(),
);

Но не работает, что означает, что я не получаю никакого значения из базы данных. Это результат запроса, который я выполнил в командной строке MySQL:

SELECT * FROM `wp_postmeta` where post_id='11839';
+---------+---------+-------------------------+-----------------------------------------------------------------------------------+
| meta_id | post_id | meta_key                | meta_value                                                                        |
+---------+---------+-------------------------+-----------------------------------------------------------------------------------+
|   22149 |   11839 | wpcf-legislacion-gratis | http://jurisprudencia.dev/wp-content/uploads/2015/02/modelodatos.pdf              |
|   22150 |   11839 | wpcf-legislacion-pagada | http://jurisprudencia.dev/wp-content/uploads/2015/02/AtencionUsuario_version1.pdf |
+---------+---------+-------------------------+-----------------------------------------------------------------------------------+

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

Как мне получить вложение? Какая-нибудь помощь или совет?

Author: ReynierPM, 2015-03-06

1 answers

Я думаю, что вам нужно get_post_meta(), а не пользовательский запрос.

ПРИЧИНЫ:

  • Результаты из пользовательских полей кэшируются и чрезвычайно упрощаются, когда это связано с производительностью. Вы можете прочитать этот ответ Я недавно сделал то, что все объяснит

  • Вы пытаетесь прикрепить настраиваемое поле к публикации только на одной странице публикации. Это то, для чего get_post_meta() был разработан

Вы можете заменить все ваши код с чем-то вроде этого: ( Изменен из кодекса)

$key_1_value = get_post_meta( get_the_ID(), 'wpcf-legislacion-gratis', true ); 
// check if the custom field has a value 
if( ! empty( $key_1_value ) ) { 
    echo $key_1_value; 
} 

РЕДАКТИРОВАТЬ

Если вам нужно получить значение настраиваемого поля вне цикла, например, в боковой панели или функции, вам нужно заменить get_the_ID() на get_queried_object_id()

$key_1_value = get_post_meta( get_queried_object_id(), 'wpcf-legislacion-gratis', true ); 
// check if the custom field has a value 
if( ! empty( $key_1_value ) ) { 
    echo $key_1_value; 
} 
 1
Author: Pieter Goosen, 2017-04-13 12:37:32