ワードプレスCocoonのランキングにコピー機能を追加するには?

ショコラ
ショコラ

ワードプレス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>

以上

Scroll to Top