php - 在 WordPress 中有多个获奖者的奖励

标签 php wordpress

首先,我是 WordPress 和 PHP 的新手。我想要一个奖励模块,我可以在其中设置多个类别,并且每个类别都有多个获奖者。

我已经在 CI (CodeIgniter) 中实现了这一点,但现在想在 WordPress 中实现类似的东西。我可以在哪里拥有一个类别,而该类别可以有多个获奖者各自的位置。我将能够执行简单的 crud 功能。
有什么建议可以如何在 WordPress 中实现此模型,或者是否有任何插件具有类似的功能?

我应该为此创建自己的插件吗?一开始我已经尝试过了

 $your_db_name = $wpdb->prefix . 'your_db_name';

// function to create the DB / Options / Defaults                   
function your_plugin_options_install() {
    global $wpdb;
    global $your_db_name;

    // create the ECPT metabox database table
    if($wpdb->get_var("show tables like '$your_db_name'") != $your_db_name) 
    {
        $sql = "CREATE TABLE " . $your_db_name . " (
        `id` mediumint(9) NOT NULL AUTO_INCREMENT,
        `field_1` mediumtext NOT NULL,
        `field_2` tinytext NOT NULL,
        `field_3` tinytext NOT NULL,
        `field_4` tinytext NOT NULL,
        UNIQUE KEY id (id)
        );";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }

}
// run the install scripts upon plugin activation
register_activation_hook(__FILE__,'your_plugin_options_install');

有什么建议吗?提前致谢

最佳答案

无需创建自定义数据库表即可执行此操作。

plugin

有很好的插件来管理 CPT 和自定义字段,使这很容易,但这里是上面概述的小插件:

<?php
/**
 * Plugin Name: (SO) Awards, prizes and winners
 * Plugin URI:  http://stackoverflow.com/q/25936506/1287812
 * Version:     0.1
 * Author:      brasofilo 
 */

class SO_25936506
{
    private $cpt = 'reward';

    public function __construct()
    {
        add_action( 'init', array( $this, 'init' ) );
        add_action( 'save_post', array( $this, 'save' ), 10, 2 );
    }

     public function init() {
        $labels = array(
            'name' => _x( 'Rewards', 'post type general name' ),
            'singular_name' => _x( 'Reward', 'post type singular name' ),
            'add_new' => _x( 'Add New', 'reward' ),
            'add_new_item' => __( 'Add New Reward' ),
            'edit_item' => __( 'Edit Reward' ),
            'new_item' => __( 'New Reward' ),
            'all_items' => __( 'All Rewards' ),
            'view_item' => __( 'View Reward' ),
            'search_items' => __( 'Search Rewards' ),
            'not_found' =>  __( 'No rewards found' ),
            'not_found_in_trash' => __( 'No rewards found in Trash' ), 
            'parent_item_colon' => '',
            'menu_name' => __( 'Rewards' )
        );
        $args = array(
            'labels' => $labels,
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true, 
            'show_in_menu' => true, 
            'query_var' => true,
            'rewrite' => array( 'slug' => _x( 'reward', 'URL slug' ) ),
            'capability_type' => 'page',
            'has_archive' => true, 
            'hierarchical' => false,
            'menu_position' => null,
            'taxonomies' => array('prize'),
            'supports' => array( 'title', 'editor', 'thumbnail' ),
            'register_meta_box_cb' => array( $this, 'add_metabox' )
        );
        register_post_type( $this->cpt, $args );

        register_taxonomy('prize', $this->cpt, array(
            // Hierarchical taxonomy (like categories)
            'hierarchical' => true,
            // This array of options controls the labels displayed in the WordPress Admin UI
            'labels' => array(
                'name' => _x( 'Prizes', 'taxonomy general name' ),
                'singular_name' => _x( 'Prize', 'taxonomy singular name' ),
                'search_items' =>  __( 'Search Prizes' ),
                'all_items' => __( 'All Prizes' ),
                'parent_item' => __( 'Parent Prize' ),
                'parent_item_colon' => __( 'Parent Prize:' ),
                'edit_item' => __( 'Edit Prize' ),
                'update_item' => __( 'Update Prize' ),
                'add_new_item' => __( 'Add New Prize' ),
                'new_item_name' => __( 'New Prize Name' ),
                'menu_name' => __( 'Prizes' ),
            ),
            // Control the slugs used for this taxonomy
            'rewrite' => array(
                'slug' => 'prizes', // 
                'with_front' => false, 
                'hierarchical' => true 
            ),
        ));
    }

    public function add_metabox()
    {
        add_meta_box( 
            'winners', 
            'Winners', 
            array( $this, 'do_metabox' ), 
            $this->cpt, 
            'normal', 
            'default', 
            array( // to build the custom fields
                '_winner_gold' => array( 'title'=>'Gold', 'desc' => 'G desc' ),
                '_winner_silver' => array( 'title'=>'Silver', 'desc' => 'S desc' ),
                '_winner_bronze' => array( 'title'=>'Bronze', 'desc' => 'B desc' )
            )
        );
    }

    // back function of add meta box that displays the meta box in the post edit screen
    public function do_metabox( $post, $box )
    {
        wp_nonce_field( plugin_basename( __FILE__ ), 'noncename_so_25936506' );
        foreach( $box['args'] as $field => $value )
            $this->print_field( $field, $value, $post->ID );
    }

    public function print_field( $field, $value, $post_id )
    {
        $post_meta = get_post_meta( $post_id, $field, true);
        $selected = ($post_meta) ? $post_meta : false;
        $users_dd = wp_dropdown_users(array(
            'name' => 'author', 
            'echo'=>false, 
            'name'=>$field, 
            'show_option_none'=>'Select winners'
        ));
        printf(
            '<label>%s: </label>%s <small>%s</small><br/>',
            $value['title'],
            $users_dd,
            $value['desc']
        );
    }

    public function save( $post_id, $post_object ) 
    {
        // Verify auto save 
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;

        // Security
        if ( 
            !isset( $_POST['noncename_so_25936506'] ) 
            || !wp_verify_nonce( $_POST['noncename_so_25936506'], plugin_basename( __FILE__ ) ) 
            )
            return;

        if ( $this->cpt !== $post_object->post_type )
            return;

        // Process post data
        foreach( array('_winner_gold','_winner_silver','_winner_bronze') as $field )
        {
            if ( isset( $_POST[$field] )  )
                update_post_meta( $post_id, $field, $_POST[$field] );
            else 
                delete_post_meta( $post_id, $field );
        }
    }
}
new SO_25936506();

关于php - 在 WordPress 中有多个获奖者的奖励,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25936506/

相关文章:

php - 如何处理大型 php mysql $_POST UPDATE/INSERT

php - 如何无误地删除所有 Woocommerce 结账账单字段

php - 如何表示一个十六进制值1F?

php - 从 PHP 使用 Wordpress XML-RPC wp.uploadFile 和 wp.newPost

wordpress - 如何去除联系表 7 中的跨度 wrapper ?

css - Cloudflare 指向我的网站,但 Css 不工作

php - WordPress PHP 电子邮件脚本

php - 检查是否有人已经投票

php - 如何计算除列的重复条目之外的所有行?

php - Zend Framework - 共享 View 脚本路径(全局部分)