ショコラ
ワードプレスCocoonのランキングにコピー機能を追加するには?
ワードプレスで「ランキング」を調べてみると、
どうも Cocoonのテーマを導入すると、ランキング機能を追加できることがわかった。
(プラグインはみつからなかった)
ひとまず、ランキングを作成することはできましたが。。。
次回のランキングを作成する際に、前回のランキングをコピーすることができないことが分かった。
もっさん先輩
ランキングは wp_cocoon_item_rankings をインサートするだけで複製できることがわかった。
INSERT INTO wp_cocoon_item_rankings(date,modified,title,item_ranking,count,visible)
SELECT now(),now(),title,item_ranking,0,1 FROM wp_cocoon_item_rankings WHERE id='[コピーするランキングのID]';
wp_cocoon_item_rankings テーブルの定義を確認してみます。
ここからはテーマの修正内容です。
form-duplicate.php のテンプレートファイルを追加します。
参考にしたファイルは wp-content/themes/cocoon-master/lib/page-item-ranking/form-delete.php です。
<?php //ランキング複製フォーム
if ( !defined( 'ABSPATH' ) ) exit;
//一覧ページへのURL
$list_url = IR_LIST_URL;
?>
<form name="form1" method="post" action="<?php echo $list_url; ?>" class="item-ranking-delete">
<?php
$id = isset($_GET['id']) ? $_GET['id'] : null;
if ($id) {
$record = get_item_ranking($id);
if (!$record) {
//指定IDの関数テキストが存在しない場合は一覧にリダイレクト
redirect_to_url($list_url);
}
$edit_url = add_query_arg(array('action' => 'edit', 'id' => $id));
}
?>
<p><?php _e( '以下の内容を複製しますか?', THEME_NAME ) ?></p>
<div id="sb-list" class="postbox" style="max-width: 800px; padding: 20px;">
<a href="<?php echo $edit_url; ?>" class="ir-list-title"><?php echo $record->title; ?></a>
</div>
<div class="yes-back">
<?php submit_button(__( '複製する', THEME_NAME )); ?>
<p><a href="<?php echo $list_url; ?>"><?php _e( '一覧に戻る', THEME_NAME ) ?></a></p>
</div>
<input type="hidden" name="action" value="duplicate">
<input type="hidden" name="id" value="<?php echo $id; ?>">
<input type="hidden" name="<?php echo HIDDEN_DELETE_FIELD_NAME; ?>" value="<?php echo wp_create_nonce('delete-item-ranking');?>">
</form>
posts-duplicate.php のロジックファイルを追加します。
参考にしたファイルは wp-content/themes/cocoon-master/lib/page-item-ranking/form-delete.php です。
<?php //内容の複製
if ( !defined( 'ABSPATH' ) ) exit;
if (!empty($_POST['id']) && !empty($_POST['action'])) {
$result = null;
$id = isset($_POST['id']) ? intval($_POST['id']) : '';
global $wpdb;
$sql = "INSERT INTO wp_cocoon_item_rankings(date,modified,title,item_ranking,count,visible) SELECT now(),now(),title,item_ranking,0,1 FROM wp_cocoon_item_rankings WHERE id = '{$id}';";
$result = $wpdb->query($sql);
//設定保存メッセージ
if ($result) {
generate_notice_message_tag(__( 'ランキングを複製しました。', THEME_NAME ));
} else {
generate_error_message_tag(__( 'ランキングの複製に失敗しました。', THEME_NAME ));
}
} else {
$message = '';
if (empty($_POST['id']) || empty($_POST['action'])) {
$message .= __( '入力内容が不正です。', THEME_NAME ).'<br>';
}
generate_error_message_tag($message);
}
_top-page.php のファイルを変更します。
バックアップをとってからファイルを変更します。
cp wp-content/themes/cocoon-master/lib/page-item-ranking/_top-page.php wp-content/themes/cocoon-master/lib/page-item-ranking/_top-page.php.bak
<?php //オリジナル設定ページ
if ( !defined( 'ABSPATH' ) ) exit;
if (isset($_POST['action']) && $_POST['action'] == 'duplicate') {
if( isset($_POST[HIDDEN_DELETE_FIELD_NAME]) &&
wp_verify_nonce($_POST[HIDDEN_DELETE_FIELD_NAME], 'delete-item-ranking') ){
///////////////////////////////////////
// 内容の複製
///////////////////////////////////////
require_once abspath(__FILE__).'posts-duplicate.php';
}
} else
if (isset($_POST['action']) && $_POST['action'] == 'delete') {
if( isset($_POST[HIDDEN_DELETE_FIELD_NAME]) &&
wp_verify_nonce($_POST[HIDDEN_DELETE_FIELD_NAME], 'delete-item-ranking') ){
///////////////////////////////////////
// 内容の削除
///////////////////////////////////////
require_once abspath(__FILE__).'posts-delete.php';
}
} else {
if( isset($_POST[HIDDEN_FIELD_NAME]) &&
wp_verify_nonce($_POST[HIDDEN_FIELD_NAME], 'item-ranking') ){
///////////////////////////////////////
// 内容の保存
///////////////////////////////////////
require_once abspath(__FILE__).'posts.php';
}
}
///////////////////////////////////////
// 入力フォーム
///////////////////////////////////////
?>
<div class="wrap admin-settings">
<h1><?php _e( 'ランキング', THEME_NAME ) ?></h1>
<!-- 使いまわしテキスト(関数テキスト) -->
<div class="item-ranking metabox-holder">
<div class="operation-buttons">
<a href="<?php echo IR_LIST_URL; ?>"><?php _e( '一覧ページへ', THEME_NAME ) ?></a>
<a href="<?php echo IR_NEW_URL; ?>"><?php _e( '新規追加', THEME_NAME ) ?></a>
</div>
<?php //一覧リストの表示
$action = isset($_GET['action']) ? $_GET['action'] : null;
if ($action == 'duplicate') {
require_once abspath(__FILE__).'form-duplicate.php';
} else
if ($action == 'delete') {
require_once abspath(__FILE__).'form-delete.php';
} else {
if (!isset($action)) {
require_once abspath(__FILE__).'list.php';
} else {//入力フォームの表示
require_once abspath(__FILE__).'form.php';
}
}
?>
</div><!-- /.metabox-holder -->
</div>
list.php のファイルを変更します。
バックアップをとってからファイルを変更します。
cp wp-content/themes/cocoon-master/lib/page-item-ranking/list.php wp-content/themes/cocoon-master/lib/page-item-ranking/list.php.bak
<?php //ランキングリスト
if ( !defined( 'ABSPATH' ) ) exit;
//var_dump($_POST);
$keyword = !empty($_POST['s']) ? $_POST['s'] : null;
$order_by = isset($_POST['order']) ? $_POST['order'] : 'date DESC, id DESC';
//var_dump($order_by);
$records = get_item_rankings($keyword, $order_by);
//var_dump($records);
//並び替えオプション
generate_sort_options_tag($keyword, $order_by);
?>
<!-- メッセージ -->
<?php if ($records): ?>
<p><?php _e( '設定を変更したり不要なものは削除してご利用ください。新しいものは「新規作成」ボタンから追加できます。', THEME_NAME );
echo get_help_page_tag('https://wp-cocoon.com/how-to-make-item-ranking/'); ?></p>
<?php else: ?>
<p><?php _e( '「ランキング」を作成するには「新規作成」リンクをクリックしてください。', THEME_NAME );
echo get_help_page_tag('https://wp-cocoon.com/how-to-make-item-ranking/'); ?></p>
<?php endif ?>
<div id="ir-list" class="postbox" style="max-width: 980px; margin-top: 20px;">
<h2 class="hndle"><?php _e( 'ランキング一覧', THEME_NAME ) ?></h2>
<div class="inside">
<table class="ir-list" style="width: 100%;">
<?php foreach ($records as $record):
//var_dump($record);
$edit_url = add_query_arg(array('action' => 'edit', 'id' => $record->id));
$delete_url = add_query_arg(array('action' => 'delete', 'id' => $record->id));
$duplicate_url = add_query_arg(array('action' => 'duplicate','id' => $record->id));
?>
<tr style="margin-bottom: 20px">
<td>
<?php if ($record->title): ?>
<div class="ir-list-title">
<a href="<?php echo $edit_url; ?>" class="ir-list-title-link"><?php echo $record->title; ?></a>
</div>
<?php endif ?>
<?php if ($record->id): ?>
<div class="ir-list-shortcode">
<?php _e( 'ショートコード:', THEME_NAME ) ?><input type="text" name="" value="<?php echo get_item_ranking_shortcode($record->id); ?>">
</div>
<?php endif ?>
<div class="demo">
<?php
ob_start();
generate_item_ranking_tag($record->id, true);
$tag = change_fa(ob_get_clean());
echo $tag; ?>
</div>
</td>
<td class="list-option" style="width: 50px;">
<?php if (!$record->visible): ?>
<div class="item-hidden">[<?php _e( '非表示', THEME_NAME ) ?>]</div>
<?php endif ?>
<p><a href="<?php echo $edit_url; ?>"><?php _e( '編集', THEME_NAME ) ?></a></p>
<p><a href="<?php echo $delete_url; ?>"><?php _e( '削除', THEME_NAME ) ?></a></p>
<p><a href="<?php echo $duplicate_url; ?>"><?php _e( '複製', THEME_NAME ) ?></a></p>
</td>
</tr>
<?php endforeach ?>
</table>
</div>
</div>
以上