web-dev-qa-db-ja.com

リンク投稿フォーマットにURLフィールドを追加

私は、95%の投稿が「リンク」の投稿形式になるブログを作成しています。

新しい "リンク"投稿を追加するときに、URLを明示的に指定したいのですが。タイトルとコンテンツの間の別のフィールドにあります。 (デフォルトではTwenty 13とは異なり、コンテンツからの最初のリンクとはみなされません)

それを達成するための最良の方法は何ですか?

1

12テーマでは、投稿フォーマットのリンクはcontent-link.phpファイルを使用して表示されます。リンクを表示する部分は次のとおりです。

<h1 class="entry-title">
<a href="<?php echo esc_url(twentythirteen_get_link_url());?>"><?php the_title(); ?></a>
</h1>

そのため、リンクはtwentythirteen_get_link_url()を使って表示されます。この関数はwp関数get_url_in_content()を使ってコンテンツ内の最初のリンクを取得し、もしあればそれを表示し、そうでなければ投稿のパーマリンクを表示します。

めったにありませんが、これらの関数には結果に対するフィルタがないため、この動作を変更するには2つの選択肢があります。

  1. テーマファイルを編集する
  2. 子テーマを作成する

提案された解決策は2番目です。 wp-content/themesフォルダーにtwentythirteen-childという名前のフォルダーを作成し、その中に2つのファイルを置きます。 1つ目は、必要なコンテンツだけを含めることができるstyle.cssです。

/*
 Theme Name:     Twenty Thirteen Child
 Author:         You
 Template:       twentythirteen
*/

@import url('../twentythirteen/style.css');

今すぐあなたのダッシュボードに行き、この新しく作成された子テーマを見つけてそれをアクティブにします。サイトにアクセスしても変化はありません。

次に、content-link.phpファイルを13個のテーマフォルダからあなたの子テーマフォルダにコピーします。上記で投稿したコードを見つけます(13〜15行目)。

これと取り替えて下さい:

<h1 class="entry-title">
  <?php $link = get_post_meta( get_the_ID(), '_my_custom_link', true); ?>
  <a href="<?php echo $link ? esc_url($link) ? esc_url(twentythirteen_get_link_url()); ?>">
    <?php the_title(); ?>
  </a>
</h1>

それを保存。

これで、非表示のカスタムフィールド'_my_custom_link'を投稿に追加できます。これは投稿のURLとして使用されます。

隠しフィールド(キーは'_'で始まります)なので、通常はメタボックスを追加していますが、投稿編集画面のタイトルの後に表示したい場合は、'edit_form_after_title'アクションフックを使用してフィールドを表示し、それ。

フィールドを分割するときは、投稿タイプが 'post'で、投稿フォーマットが空(新規投稿または投稿フォーマットなし)か 'link'と等しいことを確認してください。

そのため、新しく作成した子テーマにfunctions.phpファイルを追加し、このファイルに次の行を追加します。

add_action('edit_form_after_title', 'my_url_form_field');
add_action('save_post', 'my_url_form_field_save');

function my_url_form_field( $post ) {
  if ( $post->post_type != 'post') return;
  $format = get_post_format($post->ID);
  if ( ! empty($format) && ($format != 'link') ) return;
  ?>
  <div id="urlwrap">
  <p>
  <label for="post-link-url"><strong>URL:</strong></label>
  <input type="text" class="large-text" name="_my_custom_url" size="30" value="<?php echo get_post_meta($post->ID, '_my_custom_url', true); ?>" id="post-link-url" autocomplete="off" />
  </p>
  </div>
  <?php
}

function my_url_form_field_save( $postid ) {
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE );
  if ( isset($_POST['_my_custom_url']) ) {
    if (( strpos($_POST['_my_custom_url'], 'http://') !== 0 ) && (strpos($_POST['_my_custom_url'], 'https://') !== 0 ))
      $_POST['_my_custom_url'] = 'http://' . $_POST['_my_custom_url'];
    $url = filter_var($_POST['_my_custom_url'], FILTER_VALIDATE_URL) ? $_POST['_my_custom_url'] : '';
    update_post_meta($postid, '_my_custom_url', $url);
  }
}

プレビューまたはあなたが得るもの:

preview

これでうまくいったので、必要に応じて子テーマのcontent-link.phpをカスタマイズできます。

12人が更新を入手したとき、あなたはそれを恐れずに更新することができます:あなたの変更は子供のテーマで安全です。

4
gmazzap