it-swarm.com.de

Obligatorischer Auszug für benutzerdefinierten Beitragstyp

Dies erweist sich als Herausforderung.

Ich versuche, den Auszug zu einem Pflichtfeld zu machen, aber nur, wenn ich einen Beitrag in einem benutzerdefinierten Beitragstyp bearbeite/speichere.

Der folgende Code macht den Auszug zu einem Pflichtfeld für alle Posts, berücksichtigt jedoch nicht die Einschränkung seiner Auswirkung auf einen einzelnen benutzerdefinierten Post-Typ.

function mandatory_excerpt($data) {
  $excerpt = $data['post_excerpt'];

  if (empty($excerpt)) {
    if ($data['post_status'] === 'publish') {
      add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
    }

    $data['post_status'] = 'draft';
  }

  return $data;
}

add_filter('wp_insert_post_data', 'mandatory_excerpt');

function excerpt_error_message_redirect($location) {
  remove_filter('redirect_post_location', __FILTER__, '99');
  return add_query_arg('excerpt_required', 1, $location);
}

function excerpt_admin_notice() {
  if (!isset($_GET['excerpt_required'])) return;

  switch (absint($_GET['excerpt_required'])) {
    case 1:
      $message = 'Excerpt is required to publish a post.';
      break;
    default:
      $message = 'Unexpected error';
  }

  echo '<div id="notice" class="error"><p>' . $message . '</p></div>';
}

add_action('admin_notices', 'excerpt_admin_notice');
5
Chris

Der Code fügt einen Filter zu wp_insert_post_data hinzu:

add_filter('wp_insert_post_data', 'mandatory_excerpt');

Und hier ist der Rückruf:

function mandatory_excerpt($data) {
  $excerpt = $data['post_excerpt'];

  if (empty($excerpt)) {
    if ($data['post_status'] === 'publish') {
      add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
    }

    $data['post_status'] = 'draft';
  }

  return $data;
}

Der Filter-Callback wird $data übergeben, der gemäß Codex die folgenden Post-Daten enthält:

'post_author',
'post_date',
'post_date_gmt',
'post_content',
'post_content_filtered',
'post_title',
'post_excerpt',
'post_status',
'post_type',
'comment_status',
'ping_status',
'post_password',
'post_name',
'to_ping',
'pinged',
'post_modified',
'post_modified_gmt',
'post_parent',
'menu_order',
'guid'

Diese Daten beinhalten 'post_type', was bedeutet, dass Sie das innerhalb des Rückrufs verwenden können:

function mandatory_excerpt($data) {
    if ( 'custom-posttype-slug' != $data['post_type'] ) {
        return $data;
    } else {
        $excerpt = $data['post_excerpt'];

        if (empty($excerpt)) {
            if ($data['post_status'] === 'publish') {
                add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
            }     
            $data['post_status'] = 'draft';
        }
    }     
    return $data;
}
5
Chip Bennett

Die Lösung für das Problem, dass Posts nicht entfernt oder gar veröffentlicht werden können, besteht darin, eine zusätzliche Prüfung hinzuzufügen, um sicherzustellen, dass die Funktion mandatory_excerpt() nur ausgelöst wird, wenn kein $_GET['action'] angegeben ist. Andernfalls gibt die Funktion immer einen Fehler zurück, wenn ein Beitrag entfernt oder der Veröffentlichungsstatus geändert wird.

Die geänderte Funktion wäre also:

function mandatory_excerpt($data) {
    if ( 'custom-post-type-here' != $data['post_type'] || $_GET['action'] ) {
        return $data;
    } else {
        $excerpt = $data['post_excerpt'];

        if (empty($excerpt)) {
            if ($data['post_status'] === 'publish') {
                add_filter('redirect_post_location', 'bstcm_excerpt_error_message_redirect', '99');
            }     
            $data['post_status'] = 'draft';
        }
    }     
    return $data;
}
1
Jelle Wielsma

Ich habe nicht genug Ruf auf dieser Seite, um Kommentare abzugeben.

Beachten Sie, dass der von Ihnen verwendete Code nicht über die entsprechenden Überprüfungen für den Post-Status verfügt. Infolgedessen füllt sich Ihr Admin-Dashboard mit vielen Auto-Entwürfen, die normalerweise leer sind und niemals bereinigt werden.

Eine einfache Lösung besteht darin, Folgendes zu tun:

    function mandatory_excerpt($data) {
            if (empty($data['post_excerpt']) && $data['post_type'] != 'custom-post-type' && !isset($_GET['action'])) {

                    if ($data['post_status'] === 'publish') {
                            add_filter('redirect_post_location', 'excerpt_error_message_redirect', '99');
                    }

                    if ($data['post_status'] == 'publish' || $data['post_status'] == 'future' || $data['post_status'] == 'pending') {
                            $data['post_status'] = 'draft';
                    }
            }

            return $data;
    }
0
Jamie