Используйте Пользовательский тип записи в качестве настраиваемого поля


Я хочу создать пользовательский тип записи для магазина, в котором есть все названия магазинов, и он работает. Теперь я хочу получать все магазины в поле выбора в каждом новом сообщении WordPress, затем выбранное название магазина будет использоваться в качестве настраиваемого поля для этого сообщения. Я хочу сохранить это название магазина в качестве мета-значения для этого сообщения в таблице wp_postmeta.

Каждая пользовательская запись имеет тип post_type='хранить', так как я пишу функцию для извлечения всех записей по типу хранилища.

Author: Grant Palin, 2013-05-03

1 answers

Для получения сообщений из типа сообщений вы можете использовать get_posts()

$posts = get_posts(
    array (
        'numberposts'    => -1,
        'posts_per_page' => -1,
        'post_type'      => 'store'
    )
);

Имейте в виду, что -1 опасно: если есть миллионы хранилищ, запрос может столкнуться с тайм-аутом.

Вот очень простой пример для такого мета-блока. Вы найдете гораздо больше примеров и объяснений в нашем метабоксе с тегом .

<?php # -*- coding: utf-8 -*-
/* Plugin Name: Store metabox */

add_action( 'add_meta_boxes_post', 'wpse_98184_register_store_metabox' );
add_action( 'save_post', 'wpse_98184_save_store_metabox' );

function wpse_98184_register_store_metabox()
{
    add_meta_box( 'post_store', 'Store', 'wpse_98184_render_store_metabox', NULL, 'side' );
}

function wpse_98184_render_store_metabox( $object, $box )
{
    $nonce = wp_create_nonce( __FILE__ );
    echo "<input type='hidden' name='nonce_store_mbox' value='$nonce' />";

    $posts = get_posts(
        array (
            'numberposts'    => -1,
            'posts_per_page' => -1,
            'post_type'      => 'store',
        )
    );

    if ( ! $posts )
        return print 'No store found';

    $meta    = get_post_meta( $object->ID, '_store', TRUE );
    $selected = $meta ? $meta : 0;
    $html     = '<select name="_store"><option value="0">Select a store</option>';

    foreach ( $posts as $post )
        $html .= sprintf(
            '<option value="%1$d" %2$s>%3$s</option>',
            esc_attr( $post->ID ),
            selected( $post->ID, $selected, FALSE ),
            esc_html( $post->post_title )
            );

    $html .= '</select>';

    echo $html;
}

function wpse_98184_save_store_metabox( $id )
{
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
        return;

    if ( ! isset ( $_POST[ 'nonce_store_mbox' ] ) )
        return;

    if ( ! wp_verify_nonce( $_POST[ 'nonce_store_mbox' ], __FILE__ ) )
        return;

    if ( ! current_user_can( 'edit_post', $id ) )
        return;

    if ( ! isset ( $_POST['_store'] ) )
        return delete_post_meta( $id, '_store' );

    update_post_meta( $id, '_store', $_POST['_store'] );
}

Чтобы перечислить все эти связанные записи на странице магазина, используйте функцию, которая запрашивает мета-поля записей:

function wpse_98184_list_store_posts()
{
    $args = array(
        'post_type'  => 'post',
        'numberposts'    => -1,
        'posts_per_page' => -1,
        'meta_query' => array (
            array (
                'key' => '_store',
                'value'   => get_the_ID(),
                'compare' => '==',
            ),
        )
    );

    $posts = get_posts( $args );

    if ( ! $posts )
        return '';

    $output = '<ul class="store-posts">';

    foreach ( $posts as $post )
        $output .= sprintf(
            '<li><a href="%1$s">%2$s</a></li>',
            get_permalink( $post->ID ),
            esc_html( get_the_title( $post->ID ) )
        );

    $output .= '</ul>';

    return $output;
}

Вы можете использовать эту функцию как обработчик короткого кода:

add_shortcode( 'storeposts', 'wpse_98184_list_store_posts' );

Затем просто добавьте [storeposts] везде, где вам нужен этот список в вашем магазине.

 0
Author: fuxia, 2013-05-03 13:49:03