Поддержка Проблемы и решения wp_nonce_field, check_admin_referer, $post->ID — Связка не работает

  • Здравствуйте

    Функции кастомного плагина:
    1. Регистрирует кастомный тип записи
    2. Регистрирует кастомную таксономию
    3. Создает два кастомных метаполя Author, Link
    4. Сохраняет кастомные метаполя

    Проблемы:
    1. Не работает: $post->ID
    Работает :get_the_ID()
    2. Не работает:
    wp_nonce_field(plugin_basename(__FILE__), ‘ishot_save_meta_box’);
    check_admin_referer(plugin_basename(__FILE__), ‘ishot_save_meta_box’);
    Работает:
    wp_nonce_field()
    check_admin_referer()

    <?php
    /*
    Plugin Name: Custom Post Type
    Description: This is a plugin create user post type in WordPress
    Version: 0.1
    Author: Alexander
    */
    
    add_action( 'init', 'ishot_register_ted_talks' );
    
    function ishot_register_ted_talks() {
    
        $labels = array(
            'name' => 'TED Talks',
            'singular_name' => 'TED Talk',
            'add_new' => 'Add New',
            'add_new_item' => 'Add New Ted Talks',
            'edit_item' => 'Edit Ted Talks',
            'new_item' => 'New TED Talk',
            'all_item' => 'All TED Talks',
            'view_item' => 'View TED Talk',
            'search_items' => 'Search TED Talks',
            'not_found' =>  'No TED Talks found',
            'not_found_in_trash' => 'No TED Talks found in Trash',
            'parent_item_colon' => '',
            'menu_name' => 'TED Talks'
        );
        $args = array(
            'labels' => $labels,
            'public' => true,
            'menu_position' => 2,
            'has_archive' => true,
            'taxonomies' => array('ted'),
            'rewrite' => array('slug' => 'ted'),
            'supports' => array('title', 'editor', 'thumbnail')
        );
    
        register_post_type('ted-talks', $args);
    
    }
    
    add_action('init', 'ishot_define_product_type_taxonomy');
    
    function ishot_define_product_type_taxonomy() {
        register_taxonomy('ted', 'ted-talks',
            array(
                'hierarchical' => true,
                'label' => 'TED Taxonomies',
                'query_var' => true,
                'rewrite' => true
            )
        );
    }
    
    add_action('add_meta_boxes', 'ishot_metabox_init');
    
    function ishot_metabox_init() {
        add_meta_box('ishot-meta', 'Data', 'ishot_meta_box', 'ted-talks', 'normal', 'high');
    }
    
    function ishot_meta_box() {
        $ishot_author = get_post_meta(get_the_ID(), '_ishot_author', true);
        $ishot_link = get_post_meta(get_the_ID(), '_ishot_link', true);
    
        wp_nonce_field(plugin_basename(__FILE__), 'ishot_save_meta_box');
    
        echo '<p>Name <input type="text" name="ishot_author" value="'.esc_attr($ishot_author).'" size="30"/></p>';
        echo '<p>Link <input type="text" name="ishot_link" value="'.esc_attr($ishot_link).'" size="30"/></p>';
    }
    
    add_action('save_post', 'ishot_save_meta_box');
    
    function ishot_save_meta_box($post_id) {
    
        //check nonce for security
        check_admin_referer(plugin_basename(__FILE__), 'ishot_save_meta_box');
    
        // save the meta box data as post meta using the post ID as a unique prefix
        update_post_meta( $post_id, '_ishot_author', sanitize_text_field( $_POST['ishot_author'] ) );
        update_post_meta( $post_id, '_ishot_link', sanitize_text_field( $_POST['ishot_link'] ) );
    
    }

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Здравствуйте.

    1. Предполагаю, что нужно перед $post->ID написать global $post;
    2.
    Шаг 1. Выводите nonce в форме:
    wp_nonce_field('test_plugin_action', 'test_plugin_action_nonce');
    Шаг 2. Проверяете при сохранении

    if (!isset($_POST['test_plugin_action_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['test_plugin_action_nonce'], 'test_plugin_action')) {
        return;
    }

    Спасибо сработало.
    Изучаю Б. Уильямс, Д. Дэмстра, Х. Стэрн. WordPress для профессионалов. Разработка и дизайн сайтов (2014)

    Вы не могли бы объяснить почему не работает оригинальный код?
    Все делаю как в примере, или я лажаю или автор намудрил..
    — Почему в нем нет объявлени global $post
    — Почему не работает wp_nonce_field()

    <?php
    /*
    Plugin Name: ProWP2 Custom Meta Box Plugin
    Plugin URI: http://strangework.com/wordpress-plugins
    Description: This is a plugin demonstrating meta boxes in WordPress
    Version: 1.0
    Author: Brad Williams
    Author URI: http://strangework.com
    License: GPLv2
    */
    
    add_action( 'add_meta_boxes', 'prowp_meta_box_init' );
    
    // meta box functions for adding the meta box and saving the data
    function prowp_meta_box_init() {
    
        // create our custom meta box
        add_meta_box( 'prowp-meta', 'Product Information', 'prowp_meta_box', 'post', 'side', 'default' );
    
    }
    
    function prowp_meta_box( $post, $box ) {
    
        // retrieve the custom meta box values
        $prowp_featured = get_post_meta( $post->ID, '_prowp_type', true );
        $prowp_price = get_post_meta( $post->ID, '_prowp_price', true );
    
        //nonce for security
        wp_nonce_field( plugin_basename( __FILE__ ), 'prowp_save_meta_box' );
    
        // custom meta box form elements
        echo '<p>Price: <input type="text" name="prowp_price" value="'.esc_attr( $prowp_price ).'" size="5" /></p>';
        echo '<p>Type:
            <select name="prowp_product_type" id="prowp_product_type">
               <option value="0" ' .selected( $prowp_featured, 'normal', false ). '>Normal</option>
                <option value="special" ' .selected( $prowp_featured, 'special', false ). '>Special</option>
                <option value="featured" ' .selected( $prowp_featured, 'featured', false ). '>Featured</option>
                <option value="clearance" ' .selected( $prowp_featured, 'clearance', false ). '>Clearance</option>
            </select></p>';
    
    }
    
    // hook to save our meta box data when the post is saved
    add_action( 'save_post', 'prowp_save_meta_box' );
    
    function prowp_save_meta_box( $post_id ) {
    
        // process form data if $_POST is set
        if( isset( $_POST['prowp_product_type'] ) ) {
    
    		// if auto saving skip saving our meta box data
    		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    			return;
    
    		//check nonce for security
    		check_admin_referer( plugin_basename( __FILE__ ), 'prowp_save_meta_box' );
    
            // save the meta box data as post meta using the post ID as a unique prefix
            update_post_meta( $post_id, '_prowp_type', sanitize_text_field( $_POST['prowp_product_type'] ) );
            update_post_meta( $post_id, '_prowp_price', sanitize_text_field( $_POST['prowp_price'] ) );
    
        }
    
    }
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Почему в нем нет объявлени global $post

    Потому что там переменная передаётся в саму функцию первым параметром, а ваша функция ishot_meta_box() никаких аргументов не принимает.

    Почему не работает wp_nonce_field()

    Если в форму добавляется скрытое поле ishot_save_meta_box и его значение совпадает с plugin_basename( __FILE__ ), то wp_nonce_field() работает.

    Обратите внимание, в исходном примере check_admin_referer() вызывается только после проверки, что отправлена именно наша форма, а не какая-то другая — возможно, причина в этом.

    Автор sasha-ua

    (@sasha-ua)

    Спасибо за объяснения.

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «wp_nonce_field, check_admin_referer, $post->ID — Связка не работает» закрыта для новых ответов.